• ベストアンサー

=と==の違いを教えてください。

for文を for(式1;式2;式3) {文1…文n} while文を 式1; while(式2) {文1…文n 式3} do文を do {文1…文n 式3} while(式2); とすると、式1,3は=で式2は==でなければなりません(経験によると。) なぜ、式2だけ==なのでしょうか? 後if文でも==となりますが、たとえばどういう時に==を使うのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • os6v100i
  • ベストアンサー率44% (16/36)
回答No.8

質問者様が補足された内容によると while(a%2==1) を while(a%2=1) にするとエラーになるとのことですが 当たり前です。 この場合、左辺がa%2という式なので=で値を代入することができません。 つまり、この場合は==を=にしてしまうと式として成り立たなくなるのです。 というか、コンパイラもその旨、エラーメッセージに出てますよ?

gokugokuR
質問者

お礼

おっしゃる通りでした。 条件式は=なら代入、==なら判断をするということで、使用する場所は関係なく、今回の問題は単純に計算ができなかっただけでした。 ありがとうございました。

その他の回答 (7)

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.7

> CやC++では条件判定は中身が正の値かどうかで判定してるはず。 0か非0かで判定してます。 偽と判定されるのは0だけです。

gokugokuR
質問者

お礼

参考意見ありがとうございます。 0か0以外で偽と真に分かれているようですね。

回答No.6

CやC++では条件判定は中身が正の値かどうかで判定してるはず。 if(1)やif(2)は実行するが if(0)やif(-1)と書くと実行されない。 関係演算子は結果が真だった場合、 処理系が「1」という値に置換するはず。 int a=2, b=2, c=3; if(a==b) if(a!=c) if(a<c) この三つの条件判定はどれも真なので if(1)として実行される。 条件判定の際に代入処理を行っても結果が正なら実行される。 なのでif(a=1) if(b) if(c=2)と書いても実行されてしまう。 これがC#なんかだとBOOL型での判定なので if(a==b)は実行時にif(true)となって実行される。 if(a=1)やif(1)と書いてもBOOL型でなくint型なので コンパイラがエラーメッセージを吐いてくれる。 言語や処理系によって仕様が違うと思うので注意してください。

gokugokuR
質問者

お礼

参考意見ありがとうございます。 0以外が真で0が偽みたいですね。-1等の値を入れて実行すると、if文の中の関数が実行されていました。

回答No.5

C言語では 「=は代入演算子で、演算結果は右辺の値」 「==は比較演算子で、演算結果は右辺と左辺が等しければ非0、異なれば0」 と決まっています。 そして 「式の値が0であれば偽、非0であれば真」 と決まっています。 >なぜ、式2だけ==なのでしょうか? そんな決まりはありません。式として正しければ、何を書いても構いません。 >後if文でも==となりますが if文も、そんな決まりはありません。式として正しければ、何を書いても構いません。 >たとえばどういう時に==を使うのでしょうか? 「2つの値が等しい時に、真になる」と言う時に使います。 =式も、==式も、文法さえ合っていれば、どこに書いたって構いません。 例えば int flag; int a,b; a=1; b=2; flag = (a == b); if (flag) { printf("aとbは等しい\n"); } と書いたって良いし、 int a,b; a=1; if (b = a) { /* a の値を b に代入。結果は a の値になる */ printf("bに代入したaは0でない\n"); } と書いたって構いません。

gokugokuR
質問者

補足

大変返信が遅くなりました。 コンパイラはMicrosoft Visual C&C++ Express Editionというものを使っているのですが、if関数でもwhile関数でも=を使用しますと、ビルドエラーと表記されて実行されず、「: '=' : 左のオペランドが、左辺値になっていません。」という忠告が表記されます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>式2の場合、=にするとプログラムがエラーになってしまう コンパイル時の警告ではなくて、エラーですか?

gokugokuR
質問者

補足

大変返信が遅くなりました。 コンパイラーはMicrosoft Visual C&C++ 2008 Express Editionです。 初心者ですが現在書いているプログラムが簡単なプログラムなのですが以下のようになっています。 #include <stdio.h> int main() { int a,sum=0; printf("10以下の自然数を入力してください。\n"); l: scanf("%d",&a); while(a%2==1) {sum=sum+a;if(sum<=20) printf("入力された数字は%dで、合計%dである。\n",a,sum);else break;scanf("%d",&a);} if(a%2==0) goto l; printf("合計%dで20を超えたので終了\n",sum); } ここでwhile(a%2==1)をwhile(a%2=1)に変えると、 「ビルドエラーが発生しました。」と表示されて実行されません。 「(8):error C2106: '=' : 左のオペランドが、左辺値になっていません。」という表記がされます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

その「エラーになる」とはどのような意味でしょうか? できれば具体的な処理系とコードを挙げたうえで, 「このようなエラーになる」と示してください.

gokugokuR
質問者

補足

大変返信が遅くなりました。 コンパイラーはMicrosoft Visual C&C++ 2008 Express Editionです。 初心者ですが現在書いているプログラムが簡単なプログラムなのですが以下のようになっています。 #include <stdio.h> int main() { int a,sum=0; printf("10以下の自然数を入力してください。\n"); l: scanf("%d",&a); while(a%2==1) {sum=sum+a;if(sum<=20) printf("入力された数字は%dで、合計%dである。\n",a,sum);else break;scanf("%d",&a);} if(a%2==0) goto l; printf("合計%dで20を超えたので終了\n",sum); } ここでwhile(a%2==1)をwhile(a%2=1)に変えると、 「ビルドエラーが発生しました。」と表示されて実行されません。 「(8):error C2106: '=' : 左のオペランドが、左辺値になっていません。」という表記がされます。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

>式1,3は=で式2は==でなければなりません(経験によると。) もっと経験を積んで、必ずしもそうではない場合があることに気づいてください。

gokugokuR
質問者

お礼

式2の場合、=にするとプログラムがエラーになってしまうので不思議なんですよ。意味的に考えると関係演算子になると納得できなくもないのですが・・・。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

a==bは、aとbが同じかどうかを判断するときに使います。 a=bは、bの内容をaへ転送するときに使います。 if(a==b) { 本文1 } はaとbが等しければ、本文1が実行されます。(bの内容はaには転送されません) if(a=b) { 本文2 } は、 1)bの内容をaに転送します 2)次に、転送後のaの内容が0でなければ、本文2が実行されます

gokugokuR
質問者

お礼

ifは0が偽で1が真になって1なら{}の中の本文が実行されるということですよね。よく分かりました。 内容を転送するかしないかの違いですね。

関連するQ&A

専門家に質問してみよう