No.14279![]() |
あるプログラムの2行のことで。 投稿者---迷い人羽(2004/05/27 21:07:14) |
||
x=5; hako[x]=(x>5 || x++<6)? 10: 20; という2行はどのような処理をするのでしょうか? なおhakoはhako[0]〜hako[9]まで用意されていてそれぞれ0〜9の整数がはいっています。 よろしくお願いします。 |
No.14280![]() |
Re:あるプログラムの2行のことで。 投稿者---ぽこ(2004/05/27 21:51:54) |
||
>x=5; >hako[x]=(x>5 || x++<6)? 10: 20; >という2行はどのような処理をするのでしょうか? >なおhakoはhako[0]〜hako[9]まで用意されていてそれぞれ0〜9の整数がはいっています。 >よろしくお願いします。 ご自分で動かしてみたのでしょうか? |
No.14283![]() |
Re:あるプログラムの2行のことで。 投稿者---迷い人羽(2004/05/27 23:21:42) |
||
>ご自分で動かしてみたのでしょうか? > まだ動かしていませんでした(^^; 色々な場所にprintfなどを入れて追ってみようと思います。 ありがとうございました。 |
No.14281![]() |
Re:あるプログラムの2行のことで。 投稿者---かずま(2004/05/27 22:06:16) |
||
a = b という代入式において、a の評価 (a のアドレスを求める) と、 b の評価 (b の値を求める) の順序は未規定です。 hako[x] = (x > 5 || x++ < 6) ? 10 : 20 の場合、 = の左辺には x の値を参照するという処理があり、 = の右辺には x の値を変更するという副作用があり、 その二つのオペランドの評価順序が規定されていないため、 hako[x] が hako[5] なのか hako[6] なのかが決定できません。 したがって、どのような処理をするのかという問いに答えることはできないでしょう。 |
No.14285![]() |
Re:あるプログラムの2行のことで。 投稿者---hiro(2004/05/28 00:07:49) |
||
>hako[x] = (x > 5 || x++ < 6) ? 10 : 20 の場合、 >= の左辺には x の値を参照するという処理があり、 >= の右辺には x の値を変更するという副作用があり、 >その二つのオペランドの評価順序が規定されていないため、 >hako[x] が hako[5] なのか hako[6] なのかが決定できません。 x = 5; if(x>5){ n[x] = 10; }else if(x++ < 6){ n[x] = 10; }else{ n[x] = 20; } と同じ事ではないのですか? |
No.14286![]() |
Re:あるプログラムの2行のことで。 投稿者---RiSK(2004/05/28 00:30:58) |
||
C FAQ 3.1参照 |
No.14289![]() |
Re:あるプログラムの2行のことで。 投稿者---おでん(2004/05/28 09:44:33) |
||
>C FAQ 3.1参照 x > 5は、||で評価が終りますよね? なので、hiroの回答でいいのでは? C FAQ 3.8参照 |
No.14290![]() |
Re:あるプログラムの2行のことで。 投稿者---NykR(2004/05/28 12:17:10) |
||
>x > 5は、||で評価が終りますよね? x > 5は||で評価が終わりますが、x++が評価されないとは限りませんし、hako[x]の副作用完了点は ||よりも前ではなく、最後のセミコロンの直前です。 # ||の前に副作用完了点があるのは x > 5 だけ 従ってこの式の動作は未定義になります。 #(hako[x] = x > 5) || x++ < 6 ? 10 : 20 なら大丈夫、、結果は違うけど |
No.14297![]() |
Re:あるプログラムの2行のことで。 投稿者---YuO(2004/05/28 23:28:57) |
||
(snip) >と同じ事ではないのですか? 違います。 hako[x]=(x>5 || x++<6)? 10: 20; をif文を使って書き直すと, if (x > 5) { hako[x] = 10; } else { hako[x] = (x++ < 6) ? 10 : 20; } であり,xが5より大きい限り動作は完全に決定します。 #||演算子は短絡評価するので,x++ < 6は評価されない。 しかし,xが5以下の場合,未定義動作となります。 よって,大元の質問に対する答えは,「未定義動作」ということになります。 |
No.14298![]() |
Re:あるプログラムの2行のことで。 投稿者---hiro(2004/05/29 08:21:06) |
||
みなさま、ありがとうございます。 勉強になりました |
No.14370![]() |
Re:あるプログラムの2行のことで。 投稿者---迷い人羽(2004/06/01 19:51:20) |
||
しばらく掲示板みれませんでした。 みなさん書き込みありがとうございました。 |