• ベストアンサー

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

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文の中の関数が実行されていました。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率44% (8573/19479)
回答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% (2126/6288)
回答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% (2126/6288)
回答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

  • Do whileとFor文の脱出処理について

    はじめまして。 VBについて素朴な質問なのですが For…Nextから抜けるにはExit for を使いDo…Loopから抜けるにはExit Doを使用しますが以下の場合はFor文の中でExit doを使用するのは可能なのでしょうか? Do while(条件) for i=1 to 12 if 条件 then exit do end if 処理1 next i 処理2 loop 本来ならfor文の中ではExit forを使用しますがfor文はDo while文 の中に含まれていますのでExit doでも出れると思ったのですがそうではないのでしょうか?ご回答よろしくお願いします。

  • C言語

    C言語 10進数n(0<n<256)を2進に変換させろ 配列を使うな do-whileでnを入力させることはできましたが、そこから先がわかりません。 for文を使えと言われたのですが……

  • C言語について質問です。

    C言語について質問です。    問題:繰り返し命令と階乗の計算 カウンタ用変数nの値を1から10まで1ずつ変化させて、その値を階乗用変数Kiに順次、掛け算していき、10の階乗を求めよ。 ki=1×2×3×4×5×6・・・・・×9×10 <==10! また、1/n!は小数点以下10桁まで求めよ。 実行結果は    n                 n!             1/n!    1                 1             1、0000000000    2                 2             0、5000000000    3                 6             0、1666666667    4                24             0、0416666667    5               120             0、0083333333    6               720             0、0013888889    7              5040             0、0001984127    8             40320             0、0000248016    9            362880             0、0000027557   10           3628800             0、0000002756                            続行するには何かキーを押してください、、、、、、 上のように実行結果が出るようにプログラミングしたいのですがわからないので 分かる方よろしくお願いします。 ちなみに今まで習ってきたのは、if文、switch文、do文、while文、for文なんですがこのプログラミングは、for文でおねがいします。 長文失礼しました。

  • JAVAのfor文で困っています。

    JAVAの勉強をしていますが、本の練習問題でわからなくて困っています。for文で以下の処理を行いたいです(do,whileはなしです)が、 *を5個ごとに改行したいのですが、改行してくれません。 問題の部分↓ if (n % 5 == 0) System.out.println(); 何か良い方法はありませんか?お願いします。 ------------------------------------------------- //(数を読み込んで)だ個数だけ * を5個ごと改行しながら表示 int n = 0; for (int i = n; n <= 0;){ System.out.print("何個*を表示しますか : "); n = stdIn.nextInt(); } for (int i = 1; i <= n; i++){ System.out.print("*"); if (n % 5 == 0) System.out.println(); } ------------------------------------------------

    • ベストアンサー
    • Java
  • perlのfor文について

    perlなのですが、以下のfor文の書き方について教えてください。 for($var1,$var2,$var3,$var4){ s/^(?:Company|Organization|Office|Location)\s*:\s*// if( $_ ); s/"(?:[^"]|\")*"//g if( $_ ); 1 while s/\([^()]*\)//g if( $_ ); } これは、どのようなfor文なのでしょうか。 for文の最後に「1 while」とあるのですが、最後の行の1とは どういう意味で、ここでは何をしているのでしょうか。 また、if文が置換の処理より後ろにかかれていますが、実際は if文が先に動いているのでしょうか。 それと、「 1 while s/\([^()]*\)//g if( $_ );」が以下のようにエラー がでます。 「syntax error at x.pl line x, near "s/\([^()]*\)//g if"」 エラーを出さないようにするにはどうしたらよいでしょうか。

  • アスタリスクでダイヤ型を作る

    アスタリスクでダイヤ型の形を出力するプログラムを作ったのですが 実行例と比較して形が変になってしまいます。また、関数をif文で作ったのですがそれをfor文while文で実行できる形にするにはどのようにしたらいいのでしょうか? 実行例と私が作ったプログラムの実行データを画像に添付しました。 #include <stdio.h> int daiya( int i, int j, int Num ){ if( j<= i+Num && j<=-i+Num && j>= i-Num && j>=-i-Num ){ return 1; } } int main(){ int i, j, n; do{ puts("数字を入力:"); scanf( "%d", &n ); if(n<2||n>9){ printf("入力エラーです。もう一度入力して下さい\n"); } }while(n<2||n>9); for( j=-n/2; j<=n/2; j++ ){ for( i=-n/2; i<=n/2; i++ ){ if( daiya( i, j, n/2 ) == 1 ){ putchar('*'); } else { putchar(' '); } } putchar('\n'); } return 0; }

  • IF文やSelect文を途中で抜ける場合

    for文なら Exit For DO文なら Exit Do IF文やSelect文を途中で抜けるのは何になりますか?

  • do-while文が禁止される理由

    コーディング規約の中でdo-while文の使用が禁止されている例をよく見かけます。 確かに、 while(1){ ・・・ if(・・・){ break; } } とした方が判りやすく運用の柔軟性も高いと思いますが、 do-whileはそんなに可読性を落としてしまうものなのでしょうか?

  • 線形探索(番兵法)のプログラムについて。

    線形探索(番兵法)のプログラムについて考えています。 メイン関数からsearch関数に値を渡してそこで探索させるのですが、 int search(int a[], int n, int key) { int i = 0; a[n] = key; while (1) { if (a[i] == key) break; i++; } return (i == n ? -1 : i); } のwhileを使ったやり方からfor文を使ったやり方に変更したいと思っています。 色々な方法でプログラムを考えてみたいので。 そうすると、なんかうまくいきません。 for文だとどのように考えたらいいのでしょうか?

  • 非常に困ってます

    言語の問題集の回答がないので困っているので誰か教えてください。 私はまだ始めたばかりなので手におえません。 今私が理解しているif文、switch文、for文、while文、do-while文、配列、を 使用してでお願いします。 何重にするかを入力すると、実行例のような正方形が重なった図形を表示するプログラムを作成しなさい。 ファイルを作る際には3,4,5重の場合を実行する。(アスタリスクの数を長さとする)

HL-L3230CDWとPCが無線接続できない
このQ&Aのポイント
  • Wi-FiルータをIODATA-bb3cb0-2GにしたがPCから検出されない
  • Windows 11 Homeを使用しているが、無線LAN接続できないトラブルが発生している
  • ひかり回線を使用しているが、HL-L3230CDWとPCの間で無線接続ができない
回答を見る