|运算符,++和I运算符

时间:2012-03-20 04:40:09

标签: c++ operator-keyword

我想我会得到12,而不是7。  w++,然后w4100w++w将为8,{{ 1}}; 因此1000w++|z++100|1000 = 1100

我怎么了?

12

6 个答案:

答案 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);
}

--xx--可以做同样的事情。有关详细信息,请参阅this relevant question

答案 2 :(得分:2)

那些 post 增量运算符;它们在操作后生效,因此在操作中使用了3和7。

答案 3 :(得分:1)

x++会增加x,但会计算为w的旧值。

所以w++|z++评估为3|7(实施时恰好是7),并将wz作为副作用递增。

如果您想要您期望的行为,可以使用前缀运算符++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的第二个参数表达式时,您将分别获得z3的值7printf

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

  

后缀++表达式的值是其操作数的值。 [注意:获得的值是原始值的副本 - 结束注释]

这意味着后缀w++表达式的值是操作数本身的值,即w的值,即3,第二个表达式的值{ {1}}将为7.这些值将用于计算z++,之后,变量将递增。