質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • C

    3806questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

if文について

受付中

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 656

reotantan

score 247

細かい事なのですが、
if(条件)a=b; 単文には波括弧は要りませんよね
しかしif(条件){a=b; c=d;   }だと波括弧を使います。
これを{a=b,c=d;}にしても同じ機能を持ちますが、
プログラミングとしてはどのような違いがありますか?

あとこのコードを見ていだければ分かるように
少し汚いので、何か指摘点があれば教えてください。
辺を二つ入力して、長い方を横にして、短いものを縦に当てるというコードです。

}
int main(void){
int s1,s2;
int side1,side2;
int wide,height;
puts("rectangle");
printf("side1");scanf("%d",&side1 );
printf("side2");scanf("%d",&side2 );
if(side1>side2) {wide=side1,height=side2;}
else {wide=side2,height=side1;}
for(s1=1;s1<=height;s1++){
   for(s2=1;s2<=wide;s2++)
   putchar('*');
    putchar('\n');
}



  return 0;
}
コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2015/08/25 22:50

    「これを{a=b,c=d;}にしても同じ機能を持ちますが、」とはどういうことですか?

    キャンセル

  • reotantan

    2015/08/26 13:16

    {a=b; c=d;)が正しい書き方だと本にあったのですが、 自分が{a=b,c=d;}で実行した結果、同じものが返ってきたので どのような違いがあるのかと気になり質問してみました。

    キャンセル

回答 3

+5

あまり厳密な話は自分にも分かりませんが…

プログラミングとしてはどのような違いがありますか?
はC言語の「構文」の違いであって、「式の評価結果」(つまりプログラムの実行結果)が同じか異なるかということとは別問題です。

まず最初に整理すると、
  • 構文の違い
  • アルゴリズム(処理方式)の違い
  • フォーマットの違い
は、どれも次元(カテゴリー)の異なる問題なので、きっちりと分けて考えるべきです。

C言語の ifステートメント は if ( 式 ) ステートメント else ステートメント と定義されています。
→(参照)
そして、「ステートメント」の部分には、ここ に定義されている「各種のステートメント」を記述することができます。

a=b; と a=b,c=d; はいずれも「式ステートメント」(一次式)で、ここ に定義されているような表記法が許容されます。
(ですから、a=b,c=d; の場合は {} は不要です。)

一方、{a=b; c=d;} は ここ に定義されている「複合ステートメント」で、{ から } までが、いわゆるひと固まりの「ブロック」になります。

こうした「構文」は、コンパイラーがプログラムのソースファイルを「構文解析」して実行ファイルに変換する際に、曖昧性のない(常に同じコンパイル結果になる)ように設計されています。

厳密に言えば、どんな構文を用いてプログラムを書くかによって、コンパイル結果には違いが出る場合があります。
たとえば最適化の適用結果が異なったり、もっと細かく言えば実行時に使用されるCPUのレジスタの割り当てが変わったりなど、実行速度に違いの出る場合もありますし、実行プログラムに変換された際のファイルサイズが異なる場合もあります。もっとも、余程クリティカルなシステムでない限りほとんど意識する必要のないレベルの差だと思います。

一方、実行結果(たとえば計算結果)が同じであれば、どの構文を用いてプログラムを書くかは、完全にプログラマーの裁量に任されています。

もちろんこれは、いわゆるアルゴリズム(処理手順)の違いとは別の問題です。アルゴリズムの違いは処理効率に直接影響しますから、好みというよりも「きちんと設計」して目的にあったものを採用すべきです。

さらに別の点として、プログラムの「読みやすさ」「メンテナンス性の良さ」という問題がありますが、これはプログラムのフォーマット(書法)の問題です。

C言語は、同じ処理でもプログラマーの力量によって全く異なったプログラムになってしまうので(見た目だけでなく品質も)、先人たちの知恵に従い、読みやすくバグの混入しにくい考え抜かれた「コーディング規約」にしっかりと従うことが望ましいです。
色々な団体が独自のコーディング規約を提唱していますが、そのいくつかをご紹介します。
(参考1)
(参考2)

細かいことは上記のリンク先ページをご参照頂くとして、ご提示いただいたソースを「見やすさ」の観点だけから改善するとすれば、以下のルールを守るだけで格段に見やすくなります。
  • インデントを揃える
  • 必要以上にマルチステートメントを使用しない(1行に1ステートメント)
  • 機能のひと固まり毎に空白行を開けて区切り、適切なコメントを付ける

かなり長くなってしまいましたが…細かく書くとキリがないのでこの辺でやめます。

以上、ご参考になれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/26 13:18

    規約なんてあるんですね>確かに書き方も統一した方がいいですよね。
    貴重なご意見ありがとうございました。

    キャンセル

+1

何か指摘点があれば教えてください。
全体的に詰まった書き方で、可読性が落ちています。


そんなに行数やスペースを節約しなくてもいいです。
可読性と短さは別で、現代は前者を重視します。

コードが短いことより、理解する時間が短いこと、
あるいはバグの発生率が低いことのほうが重要です。


ただ、短いプログラムが良いとよく言われるから、
そのようにしているのかもしれません。

しかし、ムダを省いた結果として自然と短くなるのは良いですが、
最初から短く書くことを目的にするのは推奨できません。

あるいは、上級者が余興でコードゴルフをするのは構いませんが、
それを最初から目標にするのは、有害ですらあると思います。


まとめると、「短く書く」ことよりも、
「読みやすく書く」ことが大事です。



if(side1>side2) {wide=side1,height=side2;}

if (side1 > side2) {
    wide=side1;
    height=side2;
}

上下を見くらべると、上は一行で下は四行ですが、
現代のプログラミング本のサンプルコードなどは、
下のように書かれていることが多いです。

下の書き方ならデバッグやテストのときに、
何行目でエラーが出ているのか切り分けられますが、
上の書き方だとどこがエラーか分かりにくいです。

そうすると、行数が少ないからエディタをスクロールする時間を節約できるとか、
そんな細かいことは吹っ飛んでしまいます。

プログラミングにはバグを取るための時間がかなり掛かっているので、
最初からそのための書き方をします。


ですからご質問に対しては、
そもそもマルチステートメント(上の書き方)は避けるのが、
現在主流の書き方だ、というのが回答になります。



Amazon.co.jp: リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック

コードの可読性についての本は『リーダブルコード』がおすすめです。

オライリーの本にしては平易で、初心者の方でもわりと読みやすいです。
もちろん、中上級者の方が読んでもためになると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/26 13:17

    確かに回答者様のコードはとても綺麗で見やすいですね。
    これから見やすく書くように努力します、ありがとうございました

    キャンセル

0

綺麗に書くとしたらこんな感じでしょうか。

int main(void) {
    int width, height;
    puts("rectangle");
    printf("side1"); scanf("%d", &width);
    printf("side2"); scanf("%d", &height);

    if (height > width) {
        int tmp = height;
        height = width;
        width = tmp;
    }

    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            putchar('*');
        }
        putchar('\n');
    }

    return 0;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/26 13:18

    とても綺麗ですね、参考にさせていただきます。
    ありがとうございました

    キャンセル

関連した質問

  • 解決済

    c言語 while文で直角三角形を*で描く

    前提・実現したいことc言語のwhile文(for文はダメ)で*アスタリスクで5行の直角三角形を表示したいです。使わないといけないのが#define ROWS 5 が必須です(学校の

  • 解決済

    while文のなかにif文

    その名の通りwhile文のなかにif文が入っているコードがあったのですが なんだか違和感を感じました。while文の中にif文をいれることってけっこうありますか? 詳しいかた教えて

  • 解決済

    ifの適用範囲

    ifの波括弧はputcharも含んでいると思うのですが、なぜpucharはifに縛られないのでしょうか? ’#include<stdio.h>  int main(void){

  • 受付中

    点数別分布グラフ

    点数分布のグラフですが、少し長いように感じました。もう少し短くすることはできますか? またこのコードに対して何かご意見がありましたらお願いします。 #inc

  • 解決済

    ビット構成を表示するプログラム

    すいませんputcharx>>iではなく1になっていたのが原因でした。 putchar(((x>>i)&1U)?'1':'0');の部分がよく理解できません。 例えば55という数字

  • 解決済

    【C言語】スタックをリストで実現するプログラム

    毎度お世話になっております。 高橋麻奈さんの「やさしいC アルゴリズム」をみて勉強しているのですが、リストを使ったスタックのコードで、がコンパイルエラーになってしまいました。 コ

  • 解決済

    コードを見てダメ出しや指摘などお願いします。

    #include <stdio.h> int main(void){     double a;     double b;        char o;  //演算子    

  • 解決済

    [C言語] 2次元配列に一文字ずつ格納する方法

    前提・実現したいこと お世話になります。またしても初歩的な内容で申し訳ないのですが、現在勉強のため、入力を平面として捉え、「0」「1」に変換して位置関係を保持したまま出力する、と

同じタグがついた質問を見る

  • C

    3806questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。