我想我会得到12
,而不是7
。 w++
,那么w
将是4
,这是100
和w++
,w
将是8
,1000
; 所以w++|z++
将100|1000 = 1100
将12
。|运算符,++和I运算符
我怎么了?
int main()
{
int w=3, z=7;
printf("%d\n", w++|z++);
}
我想我会得到12
,而不是7
。 w++
,那么w
将是4
,这是100
和w++
,w
将是8
,1000
; 所以w++|z++
将100|1000 = 1100
将12
。|运算符,++和I运算符
我怎么了?
int main()
{
int w=3, z=7;
printf("%d\n", w++|z++);
}
的问题是,通过使用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);
}
这也可以用--x
和x--
来完成。有关更多信息,请参见this relevant question。
您是误解后缀++
运算符。在之前使用变量的值,变量增加。您的分析对于前缀++
运算符是正确的,如在++w|++z
中。
这些是后增量操作员;它们在之后生效的操作,所以在操作中使用3和7。
实际上,当使用w ++ | z ++'时,'w'和'z'已经是'4'和'7',只是'w ++'和'z ++'评估旧值'w'和'z'。 – Mankarse 2012-03-20 04:55:12
@Mankarse:固定。 – 2012-03-20 04:56:03
x++
增量x
,但它的计算结果为旧值w
。
因此w++|z++
评估为3|7
(在您的实施中恰好为7),并将w
和z
作为副作用递增。
如果你想,你是期望的行为,你可以使用前缀操作符++x
,这增加了x
和计算结果为x
新值。
您正在执行后增量(i++
),其中第一个值为i
,然后只增加它的值。
如果你想达到什么样的,你在你的问题说,这样做:++w | ++z
你可能误解了post-increment
操作者是初学者中很常见的,所以不用担心。随着时间的推移,你会得到正确的。
看一下post-increment
这个词。有一个post
字它通常表示after
。这意味着增量将会发生after
其他所有事情都已经被执行。这是我过去记住它的方式。
所以,如果你在你的程序看看现在 -
int main()
{
int w=3, z=7;
printf("%d\n", w++|z++);
}
那么就会很清楚,printf
功能本身已被执行后,增量会发生。因此,在printf
的第二个参数表达式的评估中,您将分别得到w
和z
的值为3
和7
。
官方C++ 11标准,(§5.2.6,最终版本)表示 -
后缀++表达式的值是它的操作数的值。 [注意:得到的值是原始值的副本 - 注完]
因此,这意味着后缀w++
表达式的值,是操作数本身的值,也就是,w
的值,这是3,第二个表达式z++
的值将是7.这些值将被用于3|7
的计算中,之后,这些变量将递增。
“我怎么了?”我们不知道。 – 2012-03-20 04:41:59
你可能没问题......但你所考虑的运算符优先级不是:) – 2012-03-20 04:43:49
你应该产生一个最小的例子来显示你的问题..移除'x'和'i'和'scanf'位。 – 2012-03-20 04:45:25