1

したがって、三項演算子の演算子の優先順位は、私にCは本当に奇妙に思えます。適例:

#include <stdio.h>

int main ()
{
   int i=5;
   int j=6;
   int k=7;
   printf("A: %d\n", i+j+(k!=7)?1:11); //prints 1
   printf("B: %d\n", i+j+((k!=7)?1:11)); //prints 22
   return 0;
}

これは、ここでの質問に似ているようです
。C++の3項条件付きおよび代入演算子の優先順位3項演算子の
評価順序

明確にするために、私の元の投稿のコメントが示しているように、括弧がそれを機能させることを理解しています...

最初のステートメントがコンパイラーごとに有効であるようにフォーマットされているように見えるのに、なぜ言語の作者が人々をだます可能性が高い評価方法を選ぶのか疑問に思っています。

しかし、これらの質問は、左側またはクラスメンバー内の演算子を扱っていますが、この奇妙な動作はRHSで発生します。

4

2 に答える 2

6

ここで何がおかしいのですか?最初の部分は次のように解釈されます。

(11 + (k != 7)) ? 1 : 11

2番目は次のように解釈されます

 11 + ((k !=7) ? 1 :11)

1つ目は優先順位規則(2進算術は3項演算子よりも優先順位が高い)によって引き起こされ、2つ目は式を括弧でグループ化することによって優先順位規則を回避します。

あなたの編集は理由を尋ねます、そして、その時に出席していたC委員会の誰かが助けに来ない限り、通常それらを推測することができるだけです。私の推測では、算術で式の値を決定するために三項演算子を使用するよりも、複雑な式を使用してその真理値を求める方がはるかに一般的です。このようなことが頭に浮かびます:

return (froble() + 3) == 0 ? 23 : 5; // parens for sanity but works without

これがreturn (froble() + 3) == 5;私が本当にショックを受けると解釈されるなら。

于 2012-03-19T00:13:22.070 に答える
0

非常に高い優先順位または非常に低い優先順位を選択する必要があります。どちらか一方は、間違った仮定をしている人にとっては驚くべきことです。

低優先順位を選択する便利な理由は、演算子が中括弧なしでif .. then .. else ..構文のように機能することを意味します。これは、コンパイラー作成者(両方を処理するために同じコードを使用する可能性がある)の作業が少なくなる可能性があることを意味します。 、および優先順位を理解しているコーダーによる簡単なリファクタリング。

実際には、言語はおそらく、標準化前の時代に書かれたコードで最も一般的な使用法である優先順位を標準化しました。

于 2016-03-17T22:47:16.357 に答える