1. ホーム
  2. c++

[解決済み] C言語のカンマ演算子の使用法 [重複]について

2023-02-27 21:35:46

質問

forループ文の中で使われているのを見かけますが、どこでも使える構文なんですね。もしあれば、他の場所でどのような使い方を発見しましたか?

どのように解決するのですか?

C 言語は (C++ と同様に) 歴史的に 2 つの全く異なるプログラミングスタイルが混在しており、ステートメントプログラミングと式言語プログラミングと呼ぶことができます。ご存知のように、手続き型プログラミング言語は、通常、次のような基本的な構造をサポートしています。 シーケンス ブランチング (を参照してください。 構造化プログラミング ). これらの基本的な構成は、C/C++言語では、ステートメントプログラミングのためのものと、式言語プログラミングのためのものの2つの形で存在しています。

例えば、ステートメントでプログラムを書く場合、一連のステートメントを区切り文字として ; . 分岐を行いたい場合は if ステートメントを使用します。また、サイクルや他の種類の制御転送文も使うことができます。

式言語プログラミングでも、同じような構成が利用できます。これは実際には , 演算子の出番です。演算子 , はC言語の連続した式の区切り文字に他なりません。つまり、演算子 , と同じ役割を果たします。 ; と同じ役割を果たします。式言語処理における分岐は ?: 演算子、あるいは &&|| という演算子がある。(式言語処理にはサイクルはありませんが。また、再帰で置き換えるには、ステートメントプログラミングを適用する必要があります)。

例えば、次のようなコードです。

a = rand();
++a;
b = rand();
c = a + b / 2;
if (a < c - 5)
  d = a;
else
  d = b;

は,伝統的なステートメントプログラミングの例ですが,式言語プログラミングの観点からは,次のように書き直すことができます.

a = rand(), ++a, b = rand(), c = a + b / 2, a < c - 5 ? d = a : d = b;

または

a = rand(), ++a, b = rand(), c = a + b / 2, d = a < c - 5 ? a : b;

または

d = (a = rand(), ++a, b = rand(), c = a + b / 2, a < c - 5 ? a : b);

または

a = rand(), ++a, b = rand(), c = a + b / 2, (a < c - 5 && (d = a, 1)) || (d = b);

言うまでもなく、実際にはステートメントプログラミングの方がずっと読みやすいC/C++のコードを生成するので、通常、式プログラミングは非常によく測られ、制限された量だけ使われます。しかし、多くの場合、それは便利です。そして、何が許容され、何が許容されないかの境界線は、かなりの程度、個人の好みと確立されたイディオムを認識し読み取る能力の問題なのです。

追加メモとして、言語の設計そのものが明らかにステートメント向けに調整されています。ステートメントは自由に式を呼び出すことができますが、式はステートメントを呼び出すことができません (事前に定義された関数の呼び出しは別として)。この状況は、GCC コンパイラーではかなり興味深い方法で変更されており、いわゆる ステートメント式" をサポートしています (標準 C の "expression statements" と対称的)。 "Statement expressions" では、標準 C で式ベースのコードを文に挿入できるのと同じように、式に文ベースのコードを直接挿入することができます。

C++言語では、ファンクタベースのプログラミングが重要な役割を担っており、これはquot;式プログラミングの別の形態と見なすことができます。C++の設計における現在の傾向によると、多くの状況で伝統的なステートメントプログラミングよりも好ましいと考えられるかもしれません。