お世話になっております。C言語に関しての質問です。

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(フリーコンパイラ)ではコンパイルエラーとなる。
※このように、実行できるかは環境(コンパイラ)によって異なる。
*********************
↑これくらいの認識のものなのでしょうか???
ご存知の方おりましたら、ご教授下さいますよう宜しくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/01/14 10:43:26
  • 終了:--

回答(4件)

id:GEN111 No.1

GEN111回答回数472ベストアンサー獲得回数582006/01/14 11:40:58

ポイント10pt

> ※このように、実行できるかは環境(コンパイラ)によって異なる。

結果としてそうなのでそう言えるでしょうが、そもそもコンパイルできない LSI C-86 がおかしいような気がします。


ところで (1)と(2) は等価ですか?

(2)は a = -1 でも真になりませんか?

id:mimio17

ありがとうございます、確認不足でした。

等価ではありません。ですので、&&ではなく

||のような動作をすることになりますね。

ちなみに、

#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)

のようなエラーがでます。

2006/01/14 16:50:49
id:OkadaHiroshi No.2

hiroshi回答回数10ベストアンサー獲得回数02006/01/14 12:03:04

ポイント30pt

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を評価するのとは違います。

id:mimio17

ありがとうございます、よく理解できました。

先ほどの方に対し、間違ったコメントを書いて

しまいました。失礼しました。

2006/01/14 16:52:43
id:syuzabu No.3

syuzabu回答回数155ベストアンサー獲得回数22006/01/14 13:12:24

ポイント10pt

こんにちは、質問の答えではありませんが

少し気になった部分がありましたので答えます。


> 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の条件式の結果が異なればご了承下さい。(^-^;)

id:mimio17

ありがとうございます。

1番目、2番目の方のご意見で確認できました。

2006/01/14 16:54:10
id:syuzabu No.4

syuzabu回答回数155ベストアンサー獲得回数22006/01/14 13:27:29

ポイント20pt

先ほどの条件式の結果はカンマ演算子の特性によるものでした。

参照先アドレスにもありますが、カンマ演算子は左から右へ式を評価していきます。

最終的な結果としては一番右の式のものとなります。


条件式「if(a == 0, b == 0, c == 0)」がある場合は「c == 0」のみが

実際に条件対象になります。

一度で答えられなくて申し訳ないです。調べてたら分かりました故。(^-^;)

id:mimio17

お手数をお掛けしました(*^_^*)<(_ _)>

2006/01/14 16:55:02
  • id:i_kumagoro
    LSI-Cでの結果について。

    (1)と(2)が等価でないことは誰かが指摘すると思っていたのですが、
    LSI-Cでコンパイルできないのはどうもバグのような気がします。

    (2)において 0 <= a の部分に通常の代入式等を記入した場合は
    LSI-Cでもコンパイルできましたので、特にifの条件式中で
    カンマ演算子が使えないという訳でもないようです。
  • id:mimio17
    Re:LSI-Cでの結果について。

    コメントありがとうございます。
    その問題はその問題で、エディタ等に問題があるのか
    後ほど検証してみたいと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません