C言語関係掲示板

過去ログ

No.1087 hako[x]=(x>5 || x++<6)? 10: 20;

[戻る] [ホームページ]
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)


しばらく掲示板みれませんでした。
みなさん書き込みありがとうございました。