14

gcc では、foo ? : barこれを省略形で記述できますがfoo ? foo : bar、K&R では言及されていないようです。

これは、何らかの標準で定義されている、私が頼るべきものですか? それとも、避けるべき (悪) gcc 拡張機能ですか?

4

3 に答える 3

14

これは、Conditionals with Omitted Operandsという名前のGCC 拡張機能です。

これは標準の c.Using flag for compilationではありません。-pedantic

条件式の中間オペランドは省略できます。次に、最初のオペランドがゼロ以外の場合、その値は条件式の値になります。

したがって、式

    x ? : y

x がゼロでない場合は x の値を持ちます。それ以外の場合は、y の値。

この例は完全に同等です

    x ? x : y

この単純なケースでは、中央のオペランドを省略できる機能は特に役に立ちません。これが役立つのは、最初のオペランドが (マクロ引数の場合は) 副作用を含む場合、または含む可能性がある場合です。次に、オペランドを途中で繰り返すと、副作用が 2 回実行されます。中央のオペランドを省略すると、再計算による望ましくない影響なしに、既に計算された値が使用されます。

これは、何らかの標準で定義されている、私が頼るべきものですか? それとも、避けるべき (悪) gcc 拡張機能ですか?

要件によって異なります。GCC 以外の他のコンパイラ実装でコードを実行する必要がない場合は、それを使用できます。ただし、コードが他のさまざまなコンパイラ実装に基づいて構築される場合は、それを使用しないでください。

とにかく、そのような(醜い)構造を避けることを常に提案していることを考えると、できるだけ直感的で読みやすいコードを書くことを目指すべきです。

于 2012-06-08T09:29:10.420 に答える
4

これは GCC 拡張機能です。これは C 標準の一部ではありませんが、GCC コンパイラで使用できます。詳細についてはドキュメントを参照し、「同等の」三項式との動作の違いに注意してください。

于 2012-06-08T09:27:58.330 に答える
1

これは GCC に含まれる拡張機能です。

別のコンパイラ (その拡張機能をサポートしていない) でコンパイルすると機能しません

したがって、このタイプのショートカットの使用は避けることをお勧めします。

編集: @KevinCox が指摘したように、a でも機能しDEFINEません (以下の 2 番目のコメントを参照)。

于 2012-06-08T09:27:17.537 に答える