質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

4回答

344閲覧

Cの三項演算子について

usune

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/03/09 13:53

以下のコードは任意のインデックスの値をべき乗する関数です
pw()関数の中の1の条件には()が付いていますが2には付いていません
()を付けると()を二重にしないと行けない上にpow()関数の引数は*(arr+n)としないといけません。

括弧の有無の違いとその違いでpowの引数が変わってくる理由、1と2のこの辺の違いを説明していただけたらと思います。

プログラミング初心者ですがよろしくお願いします。

C

1#include <math.h> 2 3int pw(int *arr, int size, int n) { 4 // 1: return ((size) > n) ? pow(*(arr+n), n): -1; 5 // 2: return size > n ? pow(array[n], n): -1; 6} 7 8int main(void) { 9 int arr[] = {2, 3, 4, 5}; 10 printf("%d\n", pw(arr, 4, 2)); 11 return 0; 12}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2018/03/10 15:45

あなたがプログラムをコンパイル・実行した環境の詳細情報と、そのときの実行結果を明記されてはいかがでしょう。
a_saitoh

2018/03/11 09:09

「()を付けると()を二重にしないと行けない」はどの部分の括弧のことを言ってるのか、「しないといけない」がしないとコンパイルできないのか実行結果がおかしくなるのかどっちなのか、を補足すると良いでしょう。あと、//1とかせずに実際のプログラム2種そのもの全体を提示した方が的確な答えが得られやすい。
guest

回答4

0

全部同じ結果になりました。

C#

1#include <math.h> 2 3int pw1(int *arr, int size, int n) 4{ 5 return ((size) > n) ? pow(*(arr + n), n) : -1; 6} 7 8int pw2(int *arr, int size, int n) 9{ 10 return size > n ? pow(arr[n], n) : -1; 11} 12 13int pw3(int *arr, int size, int n) 14{ 15 return (size > n) ? pow(arr[n], n) : -1; 16} 17 18int main(void) 19{ 20 int arr[] = {2, 3, 4, 5}; 21 printf("%d\n", pw1(arr, 4, 2)); 22 printf("%d\n", pw2(arr, 4, 2)); 23 printf("%d\n", pw3(arr, 4, 2)); 24 return 0; 25}

投稿2018/03/09 14:02

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usune

2018/03/09 22:18

すいません、私の環境では同じにならないので疑問に思いました。
Zuishin

2018/03/09 22:28

そう思ってソースを挙げたのでこれをそのまま実行してみてください。 同じになるはずです。 例えば質問に挙げられたソースでは arr と array のミスがあります。 類似の細かいミスが引き起こした問題だろうと思います。 括弧のせいではありません。
Zuishin

2018/03/09 22:28

あと環境のせいでもありません。
guest

0

三項演算子の先頭部分の条件式の「((size) > n)」と「size > n」は、条件式の評価順を指定する括弧をつけているかいないかになりますが、この条件式では、特に優先順位を指定する必要はないので両方ともに同じとなります。

次に、 「*(arr+n)」と「arr[n]」となります

最初の「*(arr+n)」は、ポインターを使った表現です。
こ存じと思いますが、arrでは、arrに入っているアドレスの内容が参照できることになります。さて、
このarrに1加えるということはどのように解釈するかというと、arr + 1
(arrの示すデータ型の長さ)となります。今回の例では、arrはintへのポインターとなっていますので、アドレスarr+4バイト目をアクセスすることになります。

したがって、「(arr+n)」は、arrからn4バイト先のアドレスの内容をpow関数の引数として渡すことになります。

一方、「arr[n]」は、配列を使った表現で、arrのn番目の要素を取ってくることなりますが、これは、すなわち、配列は要素(int型のデータ)順に配置するととに、要素の先頭は0ですので、n番目の要素はarr先頭からn*4バイト先となり、ポインターの表現と同じとなります。

この回答で大丈夫でしょうか

投稿2018/03/10 04:13

diracpaul

総合スコア157

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

()を付けると()を二重にしないと行けない上に

そんなことはありません。

pow()関数の引数は*(arr+n)としないといけません。

そんなことはありません。

括弧の有無の違いとその違いでpowの引数が変わってくる理由、

そんな理由はありません。括弧の有無で変える必要はありません。

1と2のこの辺の違いを説明していただけたらと思います。

どちらでも同じです。

()を付けると()を二重にしないと行けない上にpow()関数の引数は*(arr+n)としないといけません。

何故そんな考えに至ったのでしょうか?的外れです。

投稿2018/03/09 14:55

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usune

2018/03/09 22:17

すいません、私の環境では同じにならないのです
cateye

2018/03/10 10:13

LouiS0616さんも書かれていますが、環境(OS,コンパイラなど)はなんでしょう? また、問題の有ったソースも上げてもらった方がいいと思います。
otn

2018/03/10 12:12

> すいません、私の環境では同じにならないのです それは勘違いですね。 実行したソースプログラムと実行結果を書いてください。
guest

0

()を付けると()を二重にしないと行けない上にpow()関数の引数は*(arr+n)としないといけません。

全然そんなことないです。両者は連動しません。

C

1#include <math.h> 2#include <stdio.h> 3 4int pw_a1(int *arr, int size, int n) { 5 return ((size) > n) ? pow(*(arr+n), n): -1; 6} 7int pw_b1(int *arr, int size, int n) { 8 return (size) > n ? pow(*(arr+n), n): -1; 9} 10int pw_c1(int *arr, int size, int n) { 11 return size > n ? pow(*(arr+n), n): -1; 12} 13int pw_d1(int *arr, int size, int n) { 14 return (size > n) ? pow(*(arr+n), n): -1; 15} 16 17int pw_a2(int *arr, int size, int n) { 18 return ((size) > n) ? pow(arr[n], n): -1; 19} 20int pw_b2(int *arr, int size, int n) { 21 return (size) > n ? pow(arr[n], n): -1; 22} 23int pw_c2(int *arr, int size, int n) { 24 return size > n ? pow(arr[n], n): -1; 25} 26int pw_d2(int *arr, int size, int n) { 27 return (size > n) ? pow(arr[n], n): -1; 28} 29 30int main(void) { 31 int arr[] = {2, 3, 4, 5}; 32 33 printf("%d\n", pw_a1(arr, 4, 2)); 34 printf("%d\n", pw_b1(arr, 4, 2)); 35 printf("%d\n", pw_c1(arr, 4, 2)); 36 printf("%d\n", pw_d1(arr, 4, 2)); 37 printf("%d\n", pw_a2(arr, 4, 2)); 38 printf("%d\n", pw_b2(arr, 4, 2)); 39 printf("%d\n", pw_c2(arr, 4, 2)); 40 printf("%d\n", pw_d2(arr, 4, 2)); 41 42 return 0; 43}

実行結果は全部同じです。Wandbox


ところで、『nを指定したとき、n番目の数をn乗した数を返す』関数って不思議ですね。

投稿2018/03/09 14:07

編集2018/03/09 14:09
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usune

2018/03/09 22:18

すいません、私の環境では同じにならないので疑問に思いました
LouiS0616

2018/03/10 04:05

それなら環境について書いた方が良いでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問