我想我会得到12
,而不是7
。
w++
,然后w
将4
,100
,w++
,w
将为8
,{{ 1}};
因此1000
将w++|z++
为100|1000 = 1100
。
我怎么了?
12
答案 0 :(得分:3)
您误解了 postfix ++
运算符。在变量递增之前,变量的值使用。对于前缀 ++
运算符,您的分析是正确的,如++w|++z
。
答案 1 :(得分:2)
问题是,通过使用w++|z++
,您首先使用w
的值并使用z
的当前值进行ORing,然后递增每个值。改为使用++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);
}
--x
和x--
可以做同样的事情。有关详细信息,请参阅this relevant question。
答案 2 :(得分:2)
那些 post 增量运算符;它们在操作后生效,因此在操作中使用了3和7。
答案 3 :(得分:1)
x++
会增加x
,但会计算为w
的旧值。
所以w++|z++
评估为3|7
(实施时恰好是7),并将w
和z
作为副作用递增。
如果您想要您期望的行为,可以使用前缀运算符++x
,它会增加x
并计算为x
的新值。
答案 4 :(得分:1)
您正在进行后递增(i++
),首先取值i
,然后只增加它的值。
如果您想实现您在问题中所说的内容,请执行以下操作:++w | ++z
答案 5 :(得分:0)
您可能误解了post-increment
运算符,这在初学者中很常见,所以不要担心。随着时间的推移,你会做对的。
看一下post-increment
这个词。其中有post
个字词,通常表示after
。这意味着增量将发生after
其他所有内容都已执行。这就是我以前的记忆方式。
所以,如果你现在看一下你的程序 -
int main()
{
int w=3, z=7;
printf("%d\n", w++|z++);
}
然后很明显,在printf
函数本身被执行后,增量将会发生。因此,在评估w
的第二个参数表达式时,您将分别获得z
和3
的值7
和printf
。
官方C ++ 11标准(§5.2.6,最终版本)说 -
后缀++表达式的值是其操作数的值。 [注意:获得的值是原始值的副本 - 结束注释]
这意味着后缀w++
表达式的值是操作数本身的值,即w
的值,即3,第二个表达式的值{ {1}}将为7.这些值将用于计算z++
,之后,变量将递增。