2012-03-20 113 views
3

我想我会得到12,而不是7w++,那么w将是4,这是100w++,w将是8,1000; 所以w++|z++100|1000 = 110012|运算符,++和I运算符

我怎么了?

int main() 
{ 
    int w=3, z=7; 
    printf("%d\n", w++|z++); 
} 
+6

“我怎么了?”我们不知道。 – 2012-03-20 04:41:59

+2

你可能没问题......但你所考虑的运算符优先级不是:) – 2012-03-20 04:43:49

+0

你应该产生一个最小的例子来显示你的问题..移除'x'和'i'和'scanf'位。 – 2012-03-20 04:45:25

回答

2

的问题是,通过使用w++|z++,你第一次使用的w的价值,或运算,通过的z当前值,然后递增每个。改为使用++w|++z,数字将第一个递增,然后使用。

int main() 
{ 
    int x = 10; 

    // prints 10 
    printf("%d\n", x++); 
    // prints 11 
    printf("%d\n", x); 

    x = 10; 
    // prints 11 
    printf("%d\n" ++x); 
    // prints 11 
    printf("%d\n" x); 
} 

这也可以用--xx--来完成。有关更多信息,请参见this relevant question

3

您是误解后缀++运算符。在之前使用变量的值,变量增加。您的分析对于前缀++运算符是正确的,如在++w|++z中。

2

这些是增量操作员;它们在之后生效的操作,所以在操作中使用3和7。

+0

实际上,当使用w ++ | z ++'时,'w'和'z'已经是'4'和'7',只是'w ++'和'z ++'评估旧值'w'和'z'。 – Mankarse 2012-03-20 04:55:12

+0

@Mankarse:固定。 – 2012-03-20 04:56:03

1

x++增量x,但它的计算结果为旧值w

因此w++|z++评估为3|7(在您的实施中恰好为7),并将wz作为副作用递增。

如果你想,你是期望的行为,你可以使用前缀操作符++x,这增加了x和计算结果为x新值。

1

您正在执行后增量(i++),其中第一个值为i,然后只增加它的值。

如果你想达到什么样的,你在你的问题说,这样做:++w | ++z

0

你可能误解了post-increment操作者是初学者中很常见的,所以不用担心。随着时间的推移,你会得到正确的。

看一下post-increment这个词。有一个post字它通常表示after。这意味着增量将会发生after其他所有事情都已经被执行。这是我过去记住它的方式。

所以,如果你在你的程序看看现在 -

int main() 
{ 
    int w=3, z=7; 
    printf("%d\n", w++|z++); 
} 

那么就会很清楚,printf功能本身已被执行后,增量会发生。因此,在printf的第二个参数表达式的评估中,您将分别得到wz的值为37

官方C++ 11标准,(§5.2.6,最终版本)表示 -

后缀++表达式的值是它的操作数的值。 [注意:得到的值是原始值的副本 - 注完]

因此,这意味着后缀w++表达式的值,是操作数本身的值,也就是,w的值,这是3,第二个表达式z++的值将是7.这些值将被用于3|7的计算中,之后,这些变量将递增。