あまり厳密な話は自分にも分かりませんが…
プログラミングとしてはどのような違いがありますか?
は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ステートメント)
- 機能のひと固まり毎に空白行を開けて区切り、適切なコメントを付ける
かなり長くなってしまいましたが…細かく書くとキリがないのでこの辺でやめます。
以上、ご参考になれば幸いです。