[解決済み] C言語のカンマ演算子の使用法 [重複]について
質問
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++の設計における現在の傾向によると、多くの状況で伝統的なステートメントプログラミングよりも好ましいと考えられるかもしれません。
関連
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] コンマ演算子 , は何をするのですか?
-
[解決済み] あなたが今まで遭遇した最悪の実戦的マクロ/プリプロセッサの乱用は何ですか?