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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

3回答

2301閲覧

if文について

reotantan

総合スコア295

C

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

0グッド

1クリップ

投稿2015/08/25 13:40

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

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

}```ここに言語を入力#include<stdio.h>
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;
}
コード

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2015/08/25 13:50

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

2015/08/26 04:16

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

回答3

0

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

プログラミングとしてはどのような違いがありますか?

は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/25 14:55

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/26 04:18

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

0

何か指摘点があれば教えてください。

全体的に詰まった書き方で、可読性が落ちています。

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

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

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

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

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

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


C

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

C

1if (side1 > side2) { 2 wide=side1; 3 height=side2; 4}

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

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

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

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

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


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

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

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

投稿2015/08/25 18:05

編集2015/08/25 18:07
LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/26 04:17

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

0

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

c

1int main(void) { 2 int width, height; 3 puts("rectangle"); 4 printf("side1"); scanf("%d", &width); 5 printf("side2"); scanf("%d", &height); 6 7 if (height > width) { 8 int tmp = height; 9 height = width; 10 width = tmp; 11 } 12 13 for (int y = 0; y < height; y++) { 14 for (int x = 0; x < width; x++) { 15 putchar('*'); 16 } 17 putchar('\n'); 18 } 19 20 return 0; 21}

投稿2015/08/25 14:00

編集2015/08/25 14:01
hello-world

総合スコア1342

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/08/26 04:18

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問