- ベストアンサー
if文について
最近、C言語プログラムから、離れていて、久しぶりにここを覗いたのですが、 こんな質問を見ました。 質問 C言語初心者だが、学習用に良いサイトはないか? 最初の回答の方は、ある初心者用と思われるサイトを、紹介してらっしゃいました。 それに対して、他の回答者の方々は、そのサイトの一分を引用して、コンパイルできないし、間違っていると指摘されました。それは以下のようなものでした。 if(条件式) 文1; else 文2; その代わりに掲載されているのが次のようなものでした。 if(条件)条件が真のときに実行する1文; else 条件が偽のときに実行する1文; 私には、最初の回答がなぜ間違っているのか、何故コンパイルできないのか、判りません。何方か詳しく教えていただければ、嬉しいです。よろしくお願いします。
- KAZUMI2003
- お礼率65% (93/141)
- C・C++・C#
- 回答数6
- ありがとう数5
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
どっちも同じようなものなんだけど, 「文1」とか「条件が真のときに実行する1文」とか書いてあるものが何をさすのかってことなんです. 例えば C99 の式文は 式 (ないかもしれない) のあとに ';' を付けたもの です. ということは, 厳密に解釈すると「文1」とか「条件が真のときに実行する1文」とか書いてあるところに「式文」を入れると, セミコロンが 2つになっちゃうよね. だから, 後ろの else でこける. ほかの文を考えても全て同じことになります. つまり, 「文1」とか「条件が真のときに実行する1文」とかの次にセミコロンがあるから「間違っている」と指摘されているんです.
その他の回答 (5)
- jacta
- ベストアンサー率26% (845/3158)
もう少し補足すると... if文の文法に関して今回問題にしている部分については、標準化以前のCから最新のC11まで何も変わっていません。 一部のきつい方言やバグを含む処理系では、もしかするとコンパイルできるようなものもあるのかもしれませんが、それはまともなC処理系ではありませんので、別格扱いにすべきです。 (仮に参考程度の話として出すのであれば、具体的な事例を挙げるべきです) また、C++でも基本的には同じです。 C++では、監視ブロック(いわゆるtry~catch)が追加されたり、if等の条件で宣言ができたりといった違いはありますが、 if(条件式) 文1; else 文2; ではないことは間違いありません。 こんな細かい話はどうでもよいと考える人もいるかと思いますが、初学者段階でこの辺りのことをしっかり学ばせておかないから、セミコロンを付けたり外したりして、コンパイルエラーと格闘するプログラマーができてしまうのも確かです。
お礼
回答ありがとうございます。 文は式に「;」を付けたものだ、という大昔に習った事を思い出しました。
- jacta
- ベストアンサー率26% (845/3158)
少していねいに回答します。 まず、Cの文には次のものがあります。 ・ラベル付き文 ・複合文 ・式文 ・選択文 ・繰り返し文 ・分岐文 このうち、ラベル付き文はgotoのとび先やswitch文で使用するcaseやdefaultラベルを伴う文のことです。 複合文は{}で囲まれたブロックの文です。 式文は、式を評価するための文で、式がまったくない空文も式文の一種に分類されます。 選択文はif文とswitch文のことです。 繰り返し文はwhile文、do文、for文です。 分岐文はgoto文、continue文、break文、return文です。 選択文のひとつであるif文は、 if ( 式 ) 文 または if ( 式 ) 文 else 文 です。 また、ifに続く括弧の中の式(制御式)は、スカラ型に評価されなければなりません。 もし仮に、 if(条件式) 文1; else 文2; だとすると、 if (x < 0) { puts("xはマイナスです。"); return -1; } ; else printf("%d\n", x); ; のようなことになり、 ; が余分なためコンパイルできません。 if(条件)条件が真のときに実行する1文; else 条件が偽のときに実行する1文; とした場合でも同じことがいえます。
- TT414
- ベストアンサー率18% (72/384)
>if(条件式) >文1; >else >文2; 下記URLに記載の書き方には上のようにあります、「その代わりに掲載されているのが次のようなものでした。」はどこにあるのでしょう。 >if(条件)条件が真のときに実行する1文; >else 条件が偽のときに実行する1文; http://www9.plala.or.jp/sgwr-t/c/sec06-1.html if文の書き方は「if(式)文 else 文」です。 「if(条件式)文1;else文2;」と書くのは文法を知らないバカです。サイト全体が信用できないです。 if(条件式) 文1; else/*こういう風に書くとelseに対応するifが無いというエラーになります*/ 文2;
お礼
回答ありがとうございます。 文は式に「;」を付けたものだ、という大昔に習った事を思い出しました。
- utun01
- ベストアンサー率40% (110/270)
昔のC(ANSI-C?)では確かに前者はできなかった様な気がしますね。 途中で変数宣言したりとかもできなかったりだった気がします。 改行して書きたい場合は { } を入れないといけなかったような・・・。 低級言語と言われていた時代のCは色々制約が多いです。 まぁ、今から勉強する人はC言語と言ってもC++だろうし、 ちゃんとしたCだ!って言っても今時のC(C99?)でしょうから 前者が間違いだって言うのは古文の先生的思想の持ち主なのではないでしょうか。
お礼
私は、K&R第一版を読んだ世代なので、昔の話でも、改行と{}の件は、無いと断言できます。 C言語は、自由書式の言語ですからね。 回答有り難うございました。
- TinyPine
- ベストアンサー率30% (719/2386)
どっちでも一緒じゃ無いですか? 文法の問題ではなく、言葉の表現の問題。 まぁ、2番目の方が正確に表現しています。 コンパイルエラーには成らないと思います。
お礼
回答ありがとうございます。 まずは、私の挙げた2つ目の文が、私の勘違いで、正しい構文の説明ではないものだったことを、お詫びします。 要は、「文は式に『;』と付けたもの」だから、「文1;」は「文1;;」になってしまう。と言う事のようでした。
関連するQ&A
- if else文のフローチャート
c言語です。 if else文のフローチャートを教えてほしいです。 Trueの場合は処理1、Falseの場合は処理2を実行したいです。 最初に条件と書きます。
- ベストアンサー
- その他(プログラミング・開発)
- IF文
(A)IF 条件 THEN 単純実行文1 ELSE 単純実行文2 (B)IF 条件 THEN 実行処理1 ELSE 実行処理2 Aの文では単純実行分なのになぜ改行すると(B)の文みたいに実行処理になるのでしょうか? 実行処理と単純実行文の違いを教えてください
- ベストアンサー
- その他(プログラミング・開発)
- if文が上手くいかない・・・
連続投稿失礼します。 if文が上手くいきません。$hensuuの値が間違っているのにもかかわらず、条件があっている時の処理が実行されてしまいます。 なにやら癖になっているようで、if文を書くたびこのような事態が発生します。(PHPに限らず、C言語でまで・・・。)一体何が原因なのでしょうか? <?php $hensuu = "right"; if($hensuu = "wrong"){ print <<<_EOT_ 条件に合ってないはずなのに、こっちが表示されちゃう。 _EOT_; } else { print <<<_DRK_ 本来こっちが表示されるはずなのに、表示されない・・・。 _DRK_; } ?> よろしくお願いします。
- ベストアンサー
- PHP
- if文における代数の設定方法
if文を使った条件分岐をさせているんですが、条件の共通部分が多いため、代数か何かを設定してまとめられないかなと考えています。 何度も同じ条件文を書いていると、カッコが多すぎてどこがどこにかかっているのか全くわからなくなります。 代数でなくてもよいのですが、とにかく上手くまとめたいと思っています。 今作っているのは 条件C1=Note_on_c"かつMOD(I1,1)=0) 真なら(MIN(124,F1+6) 偽なら 条件C1=Note_on_c"かつMOD(I1,1)=0.5) 真なら(MAX(60,F1-5)) 偽なら 条件C1=Note_on_c"かつMOD(I1,1)=0.25) 真なら(MIN(120,F1+6) 偽なら 条件C1=Note_on_c"かつMOD(I1,1)=0.75) 真なら(MAX(90,F1-5)) 偽ならF1 というもので以下のように書いてみたのですが(まだ途中です) =IF((C1=" Note_on_c")*AND(MOD(I1,1)=0),(MIN(124,F1+6)),IF((C1=" Note_on_c")*AND(MOD(I1,1)=0.25),(MAX(60,F1-5)),F1)) とこのように、IF((C1=" Note_on_c")までは全て一緒なのですが、条件文に共通部分があっても入れ子にするしかないのでしょうか。 もっとスマートな方法があったら教えて下さいませ。
- ベストアンサー
- その他MS Office製品
- if文がコンパイルエラーを起こしてしまう…
C言語の初心者です。 まだ始めて間もない中学生なのですが、タイトル通り、以下のようなif文をコンパイルすると、コンパイルエラーを起こしてしまいます。 何度も、やり直したのですが、どうしてもエラーが出ます。 何方か、「文が変だなぁ」とお気づきなさった方は、回答を頂けると、幸いです。 どうぞよろしくお願い致します。 とりあえず、本に習って、下の文を作成しました。 #include <stdio.h> main() { int year; year = 14; /* 数字のところにあなたの年齢を入れてください。 */ if (year < 20) { printf("あなたはまだ、20を過ぎていないので、お酒は飲めません。\n"); } else { printf("あなたは成人なので、楽しくお酒を飲むことが出来ます。\n"); } if (year == 20) { printf("あなたは、今年成人式ですね。\n"); } if (year >= 18 ) { printf("あなたは結婚が出来る年齢ですね。\n"); } }
- ベストアンサー
- C・C++・C#
- Visual C++でのif文
Visual C++でifやelseを入れた文をコンパイルすると エラーがでてしまします。Visual C++専用の命令が あるんでしょうか?分かる人教えてください。 あと、ほんとに最初から始める場合にお勧めの書籍などがあれば教えてください。
- ベストアンサー
- C・C++・C#
- Bシェルのif文
if文の否定について教えてください。 if $aa='xxx' then else echo yyy fi 間違っているかもしれませんが上に書いたことをやろうとしています。 他の言語の if(!($aa='xxx'))echo yyy; をBシェルのif文で書くにはどうしたらいいですか? $aa='xxx'を$aa!='xxx'にするのではなくて、その外側のifの書式を教えてください。 最初に書いたコードでは、if(!条件)を知らないので if(条件) else 処理 endif のように書きました。
- 締切済み
- その他(プログラミング・開発)
- if文の使い方について
if文でaの値とbの値とcの値が一緒なら次の処理を行うものを作成したいのですが。 if($a==$b==$c){ 行いたい処理 }else{ その他の処理 } と書いたのですが、ダメで if($a=$b=$c){ 行いたい処理 }else{ その他の処理 } と書いたのですが、これもダメでした。 if($a==$b) { if($b==$c) { 処理 }else{ その他の処理 } }else{ その他の処理 } と書かいたら実行されたのですが、このように分けて書かないとダメなのですか? いいやり方がありましたら教えてください
- ベストアンサー
- PHP
- while文と無限ループの違い
はじめまして。大学でC++を習い始めたばかりの初心者です。 最近while文とwhile文と使った無限ループを知ったのですが、 両者の違いがイマイチわかりません。 私のイメージですと、while文は条件が真である限り何度でも判定し 条件が偽になればループを抜ける。 一方無限ループもif文を使った条件が真にならない限りbreakしない。 while文の偽と判定する部分がif文で真と判定するだけで、同じような気がするのですが… ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。
- 締切済み
- C・C++・C#
お礼
回答ありがとうございます。 Tacosan様の回答を読んで、2つ目の回答が、一回目の回答同様、正しくないものの例だったことに気付きました。 要は、「文は式に『;』と付けたもの」だから、「文1;」は「文1;;」になってしまう。と言う事なのですね。