1

演算子はC+++よりも優先順位が高いため、式は次のように評価する必要があります。<<a << b + c << d

a << (b + c) << d

しかし、それは意味がありません。次の場合、より多くの感覚を得ることができます

a << (b + (c << d))

+しかし、それはoverの優先順位に違反<<していますね。コンパイラは「理にかなっている」部分をどのように評価しますか?

更新:質問をするとき、2 番目のバリアントがコンパイラによって使用されていると思いました。そのため、コンパイラがどのようにしてこの評価に至ったのか疑問に思っています。実際、最初のものが使用され、それが正しいものです。

4

4 に答える 4

6

「納得」は主観です。これが、コンパイラが「意味」を評価するのではなく、一連の規則に基づく文法を評価する理由です。<<(これらの一連のルールによって指定される) 優先順位が高いため、式は次のように評価されます。

 a << (b + c) << d

疑問がある場合は、括弧を使用してください。

于 2013-04-11T15:47:41.693 に答える
2

コンパイラは、意味のあることを考慮しません。彼らは単にルールに従います。

ルールを作成するのは言語の設計者であり、通常、それらのルールを意味のあるものにしようとします。もちろん、ある人には理にかなっているように見えても、別の人には奇妙に見えます。それを回避する方法は本当にありません。

于 2013-04-11T15:48:55.433 に答える
1

operator <<よりも優先順位が低くなりoperator +ます。ウィキペディアを参照してください。

コンパイラは、意味があるかどうかを理解しようとしません。文法のルールに従っているだけです。左シフトがプラスよりも低い優先度を与えられた理由を真に知るには、デニス・リッチーの亡霊に尋ねる必要があります。

それとは別に、文法で必要に応じて優先順位を付けたい場合は、左シフトとプラスを同じ優先度 (および左から右への結合) で行う必要があります。

ただし、そのような使用例を考えると、次のようになります。

unsigned int a, b, mid;
...
mid = a + b >> 1;

a + b最初に計算するのは完全に理にかなっています。ですから、もともと C が設計されたとき、シフトは一般的な算術演算の後に来ると決めていたと思います。


C++ では、これによりさらに快適になります。今のやり方では、次のように書くことができます:

cout << a + b << endl;

括弧は必要ありません。これは単なる偶然の一致であり、これらの優先順位の元の理由には何もありません.

于 2013-04-11T15:52:07.430 に答える
0

この場合、コンパイラは優先順位の最も高い演算子を探し、対応する演算を計算します。+ を打ち、b & c を合計します。その後、2 つの << 演算子が残り、コンパイラはそれらを順番に処理します

于 2013-04-11T15:56:03.950 に答える