2011-07-26 9 views
-8

私は以下のコードを持っていて、何が出力可能なのか知りたいと思っていました。このコードを処理することは& &として与えられたCコードが異なるコンパイラによって解釈される方法

m = ++i || (++j && ++k); 

が高い優先順位をオーバーしたとして、これexpresionを見ることができる

を言うルールで行くコンパイラだろうが今の質問は

int main() 
{ 
int i = -1, j = 2, k = 0, m; 
m = ++i || ++j && ++k; 
printf("\n %d %d %d %d \n", i, j, k, m); 
return 0; 
} 

| |その結果は、0 2 0 1

または

このexpresionは

m = ++i || (++j && ++k); 

が、コンパイラは、まだショートにしようとすると見ることができるだろう。それは1ですので、それは(++ J & & ++ K)、++私を評価> evaluated.soはANSではありません優先するので、原因のような式++i || ++j && ++k意志グループ0 3 1 1

+1

スペックを読んで(より良い)見つけたり、コードを実行して(より速く)見つけることができます。ここでこの質問をする目的は何ですか? – Jon

+0

私はこの回路ルールについて知りたがっています。 –

+0

@Jonあなたはこの投稿を読んだのですか? –

答えて

2

次のとおりです。式の評価順序約Cが持ついくつかのルールの

++i || (++j && ++k) 

一つ||の左側と `& &オペレータが(短絡用)右側の前に実行しなければならないということです。これは、オプションではない言語要件です。

つまり、最初に++iを評価する必要があります。それは0を返すでしょう(質問で誤って言及すると、それは1に評価されません)。それは||の動作を短絡するのに十分ではないので、右側を評価する必要があります。同様のプロセスが、オペレータ&&の評価のために行われます(そして、オペレーションの両側が評価される必要があります)。

結果の出力は次のようになります

0 3 1 1 

かかわらず、コンパイラ。その式を評価する未定義、不特定、または実装定義の振る舞いはありません。

等に起因順位に発現++i || ++j && ++k意志基:Cは、式の評価順序について有しているいくつかのルールの

++i || (++j && ++k) 

一つは、||と `& &オペレータの左側(短絡の場合)の前に実行する必要があります。これは、オプションではない言語要件です。

つまり、最初に++iを評価する必要があります。それは0を返します。それは||の動作を短絡するのに十分ではないので、右側を評価する必要があります。同様のプロセスが、オペレータ&&の評価のために行われます(そして、オペレーションの両側が評価される必要があります)。

結果の出力は次のようになります

0 3 1 1 

かかわらず、コンパイラ。その式を評価する未定義、不特定、または実装定義の振る舞いはありません。

あなたは、あなたの質問に言及した出力を得るための一つの方法は、代わりに次の式を使用することである

--i-2に評価し、短絡ルールがその権利を要求する。この場合、

m = --i || ++j && ++k; 

を、 ||オペレータではなく、と評価してください。したがって、jkは放置されます。

関連する問題