if文に関して、例えば
int a = 5;
の変数があり、[aが0以上かつ10以下であるときは
処理Bを行う]ときに
if(0 <= a && a <= 10)
処理B;…(1)
と、普通は記述するのかと思います。
ですが、.net 2003などで
if(0 <= a , a <= 10)
処理B;…(2)
などと記述しても、コンパイルも通り(1)と全く同様に
処理が行えます。
(2)の記述は、LSI C-86(フリーコンパイラ)ではコンパイル
エラーとなります。
*********************
※(2)の書き方は、.net 2003の場合は、カンマ演算子として
「(2)の条件部分を、左の式から評価を行い、どちらも成り立つので
処理Bが実行される」というように実行されている。
※LSI C-86(フリーコンパイラ)ではコンパイルエラーとなる。
※このように、実行できるかは環境(コンパイラ)によって異なる。
*********************
↑これくらいの認識のものなのでしょうか???
ご存知の方おりましたら、ご教授下さいますよう宜しくお願いします。
http://www.kis-lab.com/serikashiki/C/C02.html
�J���}���Z�q
> ※このように、実行できるかは環境(コンパイラ)によって異なる。
結果としてそうなのでそう言えるでしょうが、そもそもコンパイルできない LSI C-86 がおかしいような気がします。
ところで (1)と(2) は等価ですか?
(2)は a = -1 でも真になりませんか?
http://www.sysworks.com.au/disk$axpdocsep992/japanese/dj01a131.p89.bkb:detail]
ANSI C の規格によれば、
コンマ演算子は左から右に処理され、左の値は捨てられる。(ただし、関数の引数等コンマが別な意味を持つときは、括弧で括らなくてはいけない)とあります。
したがって、if 文の条件式の中はコンマが特別の意味を持つ場所ではないので、コンパイルが通らないのは ANSI に準拠した C の処理系ではないということになります。
なお、if( 式1 , 式2)の場合、
式1 も
式2 も 評価され。
しかも 式1 に関しては結果は捨てられます。
なので、
if( 式1 && 式2)
のように式1を評価して真のときのみ式2を評価するのとは違います。
ありがとうございます、よく理解できました。
先ほどの方に対し、間違ったコメントを書いて
しまいました。失礼しました。
http://www.st.rim.or.jp/~phinloda/cqa/cqa6.html#Q17
$B=i5i(JC$B8@8l(JQ&A(6)
こんにちは、質問の答えではありませんが
少し気になった部分がありましたので答えます。
> if(0 <= a && a <= 10)
> 処理B;…(1)
>
> と、普通は記述するのかと思います。
> ですが、.net 2003などで
>
> if(0 <= a , a <= 10)
> 処理B;…(2)
>
> などと記述しても、コンパイルも通り(1)と全く同様に
> 処理が行えます。
結果もまったく同一になりましたでしょうか?
当方.net2003ではありませんが、VC++2005で確認したところ
(2)の場合は初めの式(0 <= a)は無視されているように思えます。
試しにaにマイナスの値や、初めの式を 0 などを入れれば
確認できると思います。(後ろの式(a <= 10)の条件のみで判断します。)
.net2003とVC++2005の条件式の結果が異なればご了承下さい。(^-^;)
ありがとうございます。
1番目、2番目の方のご意見で確認できました。
http://www.yuasa.kuis.kyoto-u.ac.jp/study/ncx/chap9_4.html
9.4 $B%+%s%^1i;;;R(B
先ほどの条件式の結果はカンマ演算子の特性によるものでした。
参照先アドレスにもありますが、カンマ演算子は左から右へ式を評価していきます。
最終的な結果としては一番右の式のものとなります。
条件式「if(a == 0, b == 0, c == 0)」がある場合は「c == 0」のみが
実際に条件対象になります。
一度で答えられなくて申し訳ないです。調べてたら分かりました故。(^-^;)
お手数をお掛けしました(*^_^*)<(_ _)>
ありがとうございます、確認不足でした。
等価ではありません。ですので、&&ではなく
||のような動作をすることになりますね。
ちなみに、
#include <stdio.h>
void main(void){
int A=5;
if(0 <= A , A <= 10)
printf(”yes¥n”);
}
をLSI C-86でコンパイルすると
TEST06~1.c 6: 警告: 値を使っていない式がある
TEST06~1.c 6: cg error (no match)
のようなエラーがでます。