2016-04-29 5 views
1

このコードは、trueと評価:演算子評価

#include <iostream> 


int main(){ 
int x = 9; 
int j = x-1; 

if(x - j+1 > 1) 
    std::cout << "Ehhhh???\n"; 
} 

しかし、falseに、この1:

#include <iostream> 

int main(){ 
int x = 9; 
int j = x-1; 

if(x - (j+1) > 1) 
    std::cout << "Ehhhh???\n"; 
} 

プラスとマイナス演算子は、私も一つだけを使用しています「<」よりも優先順位が高いですデータ型はboオーバーフローが発生するはずです。なぜ結果が異なるのですか?算術+の優先ので

+1

では、[cタグ]をタグ付けしないでください。ありがとう。 –

+0

_ "1つのデータ型しか使用していないので、[no]オーバーフローが発生するはずです。" _これは非連続です。 2つのものは本質的にお互いに関係ありません。 –

答えて

7

この実際には、1がどのような価値を追加するかということだけです。加算と減算は、左から右への結合性を持っているので、左から始め、正しい方法で作業します。

x - (j + 1) 
9 - (8 + 1) 
9 - 9 
0 

軍として添加がj代わりのx-jに取り付けられる

x - j + 1 
(9 - 8) + 1 
1 + 1 
2 

ので第二の場合は、当然偽です。もしC++を書いているとき

+0

「1が「j」に追加されたときに誤解を招く」と思う。最初のケースでは、実際に 'x'に1が加えられ、' j'から減算されます。 – Slava

+0

@Slavaこれは良いですか?私は、1つの追加が進んだときに言う良い方法を理解するのは難しい時です。それが大丈夫だと思わない限り。 – NathanOliver

+0

はい私はそう思います:) – Slava

6

及び - から同じであるが連想されるが括弧なしの一方が第すなわち、次に加算を減算を行います、右左:

x - j+1 ==2 //here the operation is performed from left to right,subtraction first then addition 
x - (j+1)==0 //here the one inside the parenthesis will be done first,i.e addition first then subtraction 
2

数学的には、あなたが2つの異なる表現があります:

x - j + 1 is equal to x - (j - 1) 

x - (j + 1) is equal to x - j - 1