14

好奇心から、false と評価された場合に false 分岐で何もしない三項式を使用できるかどうか疑問に思い始めました。

つまり、次のような書き方があります。

variable = (someBool) ? i : <do nothing>;

とは対照的に:

if (someBool) {
    variable = i;
}

((void)0)orを no-op として試しwhile(false){};ましたが、コンパイラは式を想定しています。

アップデート:

コードを簡単にしようとしたため、質問の意味が失われていることに気付きました。私が持っていた最初のアイデアは、静的変数自体を条件として使用して、静的変数を 3 項で初期化することでした。

static int var = (var != 0) ? var = 1 : (var already initialized, do nothing);

これは、初期化されていない変数が 0 に初期化されていることを前提としていますが、これは常に真であるとは限りません (または、リリース ビルドではまったくそうではありません)。だから多分それは仮定の質問です。

4

10 に答える 10

16

短絡はどうですか?

int variable = 0;
bool cond = true; // or false

(cond && (variable = 42));

printf("%d\n", variable);
于 2013-10-08T10:45:22.733 に答える
6

これはどう:

variable = (someBool) ? i : variable ;

私は個人的には元の if ステートメントを好みますが

于 2013-10-08T10:41:52.850 に答える
4

コンパイラはexpressiontypeだけでなく、式が左側に返すことも期待します (その型はvariable何でも)。だから、いいえ、あなたはそれをすることはできません. 条件付き実行ではなく、メンバーvariable代入です。

これらはまったく別のものです。2 番目の例では:

if (someBool) {
    variable = i;
}

何も割り当てず、条件に基づいて実行するだけです。したがって、何もたくない(何も割り当てない)あなたの場合、行く方法は条件付き実行なので、単純に2番目のケースを使用してください。

于 2013-10-08T10:41:25.947 に答える
2

条件式の形式は次のとおりです。

<expression> ? <expression> : <expression>

つまり、何らかの表現が必要です。

于 2013-10-08T10:43:01.883 に答える
2

あなたの編集への対処: C99 では静的スコープの変数は 0 に初期化されます。

とにかく、変数を初期化するだけです。変数は静的であるため、プログラムの実行時間全体で一度だけ発生します。

于 2013-10-08T11:02:07.220 に答える
1

あなたがすることができます:

variable = !someBool ?: i;

?: は、if 式が true の場合は何もしませんが、false の場合は i を割り当てます。

注: これは Obj-C でのみテストされています

于 2014-05-29T15:39:48.027 に答える
0

の代わりに null 許容オブジェクト型を評価する場合はbool、常に次のように記述できます。

variable = myVar ?? i;

ハック/クラッジー/非実用的 - おそらく3つすべてですが、この質問のために、それは「else」を省略する方法です.

于 2013-10-08T10:50:56.933 に答える
0

どうですか

(someBool) ? (variable = i) : NULL;
于 2013-10-08T10:43:25.120 に答える
0

C# の場合: 構文:

condition ? first_expression : second_expression;

そして、first_expression と second_expression について次のように述べています。

first_expression と second_expression の型が同じであるか、一方の型から他方の型への暗黙的な変換が存在する必要があります。

于 2013-10-08T10:43:29.983 に答える