3
i = 1, 2, 3, 4, 5;

これは実際に に割り当て1ますi

*****この種の割り当ては、実際にどこかで役立つのだろうか?*****

この構文のアプリケーションを知っていますか?

4

9 に答える 9

15

この構文は、for ループで 2 つの反復変数を使用する場合に非常に便利です。

for ( i = 0, j = 0; i < 10 && j < 10; i++ ) {
  ..
}
于 2009-11-05T20:58:25.717 に答える
14

これは、C の最も優先度の低い演算子であるコンマ演算子です。C の優先順位規則に従って、その行は次のように解析されます。

(i = 1), (2), (3), (4), (5);

その行で何か他のことをしたい場合、これは「役に立つ」かもしれません:

i = 2, j = 3, k++;

ステートメントに角かっこを使用する必要がなくなりますif()(また、後で頭痛の種になる可能性もあります)。または、for()ループの制御フローに複数の式を含めることができます (これは、実際にはコンマ演算子のかなり正当な使用法です)。

于 2009-11-05T21:00:04.803 に答える
6

コンマ演算子のもう 1 つの一般的な用途は、whileループ条件です。

while (c = getchar(), c != EOF && c != '\n')
{
于 2009-11-05T21:05:34.050 に答える
6

アプリケーション:難読化された C コンテスト!

于 2009-11-05T20:59:09.290 に答える
5

「課題の種類」ではありません。コンマ演算子は、割り当てよりも緩く、非常に緩くバインドします。したがって、次のようなものを書きました:

((((i = 1), 2), 3), 4), 5;

void コンテキストの整数リテラルは役に立たない (assert のように、特定の場合に何もしないマクロで警告を回避する場合を除いて) ので、いいえ、まさにこの構文を使用する必要はありません - i を 1 に設定し、に評価される式の必要性5 はかなり制限されており、そのケースが見つかったとしても、2、3、4 は冗長です。

より便利な可能性がありますi = 1, code_that_actually_does_something;。コンマ演算子の最も頻繁な使用は、「if」条件や「while」条件、または式として評価する必要があるマクロなど、複数のステートメントが許可されていないコンテキストで複数の副作用を忍び込ませることです。

于 2009-11-05T20:58:48.963 に答える
3

これはカンマ演算子で、複数の式を 1 つに結合できます。

コンマ演算子より優先度が高い (i = 1), 2, 3, 4, 5ため、コンパイラはそれを として解析します。=

ループを除いてfor、それは一般的に有用ではなく、その使用は嫌われています。

于 2009-11-05T21:00:28.563 に答える
0

これは、いくつかのことを実行し、関数のような値を返すマクロを作成する場合に役立ちます。

#define STEAL_MAGIC_HAT(thing1, thing2, cat) \
(smack(thing1), punch(thing2),get_hat(cat))

extern thing_t g_thing1, g_thing2;
extern cat_t g_cat;
...

    hat_t hat = STEAL_MAGIC_HAT(g_thing1, g_thing2, g_cat);
    don(hat);
...
于 2009-11-05T21:31:39.153 に答える
0

課題では、この特定の例がどこで役立つかを考えることはできません。

ただし、次のことができます。

x = 1, y = 2, z = 3;

そして、それらは単一のステートメントとして扱われ、左から右に評価されます (C89 による)。

于 2009-11-05T21:03:43.500 に答える
0

他の人がすでに指摘したように: このステートメントは 1 を i に割り当て、次に 2、次に 3、次に 4、そして 5 を評価します。ステートメントの全体的な値は 5 (最後に評価された式) です。

于 2009-11-05T21:06:21.967 に答える