if文の使い方についての質問

このQ&Aのポイント
  • C言語初心者が学習用に良いサイトを探している
  • 回答者が一つのサイトを紹介するも、他の回答者から指摘を受ける
  • 回答者の間でif文の使い方について議論が発生
回答を見る
  • ベストアンサー

if文について

最近、C言語プログラムから、離れていて、久しぶりにここを覗いたのですが、 こんな質問を見ました。 質問 C言語初心者だが、学習用に良いサイトはないか? 最初の回答の方は、ある初心者用と思われるサイトを、紹介してらっしゃいました。 それに対して、他の回答者の方々は、そのサイトの一分を引用して、コンパイルできないし、間違っていると指摘されました。それは以下のようなものでした。 if(条件式) 文1; else 文2; その代わりに掲載されているのが次のようなものでした。 if(条件)条件が真のときに実行する1文; else 条件が偽のときに実行する1文; 私には、最初の回答がなぜ間違っているのか、何故コンパイルできないのか、判りません。何方か詳しく教えていただければ、嬉しいです。よろしくお願いします。

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

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

どっちも同じようなものなんだけど, 「文1」とか「条件が真のときに実行する1文」とか書いてあるものが何をさすのかってことなんです. 例えば C99 の式文は 式 (ないかもしれない) のあとに ';' を付けたもの です. ということは, 厳密に解釈すると「文1」とか「条件が真のときに実行する1文」とか書いてあるところに「式文」を入れると, セミコロンが 2つになっちゃうよね. だから, 後ろの else でこける. ほかの文を考えても全て同じことになります. つまり, 「文1」とか「条件が真のときに実行する1文」とかの次にセミコロンがあるから「間違っている」と指摘されているんです.

KAZUMI2003
質問者

お礼

回答ありがとうございます。 Tacosan様の回答を読んで、2つ目の回答が、一回目の回答同様、正しくないものの例だったことに気付きました。 要は、「文は式に『;』と付けたもの」だから、「文1;」は「文1;;」になってしまう。と言う事なのですね。

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

もう少し補足すると... if文の文法に関して今回問題にしている部分については、標準化以前のCから最新のC11まで何も変わっていません。 一部のきつい方言やバグを含む処理系では、もしかするとコンパイルできるようなものもあるのかもしれませんが、それはまともなC処理系ではありませんので、別格扱いにすべきです。 (仮に参考程度の話として出すのであれば、具体的な事例を挙げるべきです) また、C++でも基本的には同じです。 C++では、監視ブロック(いわゆるtry~catch)が追加されたり、if等の条件で宣言ができたりといった違いはありますが、 if(条件式) 文1; else 文2; ではないことは間違いありません。 こんな細かい話はどうでもよいと考える人もいるかと思いますが、初学者段階でこの辺りのことをしっかり学ばせておかないから、セミコロンを付けたり外したりして、コンパイルエラーと格闘するプログラマーができてしまうのも確かです。

KAZUMI2003
質問者

お礼

回答ありがとうございます。 文は式に「;」を付けたものだ、という大昔に習った事を思い出しました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

少していねいに回答します。 まず、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)
回答No.4

>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;

KAZUMI2003
質問者

お礼

回答ありがとうございます。 文は式に「;」を付けたものだ、という大昔に習った事を思い出しました。

  • utun01
  • ベストアンサー率40% (110/270)
回答No.3

昔のC(ANSI-C?)では確かに前者はできなかった様な気がしますね。 途中で変数宣言したりとかもできなかったりだった気がします。 改行して書きたい場合は { } を入れないといけなかったような・・・。 低級言語と言われていた時代のCは色々制約が多いです。 まぁ、今から勉強する人はC言語と言ってもC++だろうし、 ちゃんとしたCだ!って言っても今時のC(C99?)でしょうから 前者が間違いだって言うのは古文の先生的思想の持ち主なのではないでしょうか。

KAZUMI2003
質問者

お礼

私は、K&R第一版を読んだ世代なので、昔の話でも、改行と{}の件は、無いと断言できます。 C言語は、自由書式の言語ですからね。 回答有り難うございました。

  • TinyPine
  • ベストアンサー率30% (719/2386)
回答No.1

どっちでも一緒じゃ無いですか? 文法の問題ではなく、言葉の表現の問題。 まぁ、2番目の方が正確に表現しています。 コンパイルエラーには成らないと思います。

KAZUMI2003
質問者

お礼

回答ありがとうございます。 まずは、私の挙げた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")までは全て一緒なのですが、条件文に共通部分があっても入れ子にするしかないのでしょうか。 もっとスマートな方法があったら教えて下さいませ。

  • C言語 if文

    C言語のif文についての質問なのですが、ifを使い、条件Aの時は1のプログラムを実行、条件Bの時は2のプログラムを実行するようにしたとき、1と2のプログラム自体にもif文が使われています。その場合は、AとBの時のifと1と2に使われているifをどのように区別するのですか?(ちなみに1と2のif文については、それぞれ実行してみたところ動作可能でした。)説明が下手ですいません。初心者ですので、分かりやすく教えていただけると有難いです。

  • 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");     } }

  • Visual C++でのif文

    Visual C++でifやelseを入れた文をコンパイルすると エラーがでてしまします。Visual 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文で真と判定するだけで、同じような気がするのですが… ド素人の考えで恥ずかしいのですが、違いをわかりやすく教えてください。

専門家に質問してみよう