|运算符、++ 和 I 运算符

| operator , ++ and I operator

本文关键字:运算符      更新时间:2023-10-16

我想我会得到12,而不是7w++,那么w将被4,即100w++w将被81000;所以w++|z++将被100|1000 = 1100将被12.

我怎么了?

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

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

问题是通过使用 w++|z++ ,您首先使用 w 的值并将其与当前值 z 相加,然后递增每个值。 请改用++w|++z,数字将首先递增,然后使用。

int main()
{
    int x = 10;
    // prints 10
    printf("%dn", x++);
    // prints 11
    printf("%dn", x);
    x = 10;
    // prints 11
    printf("%dn" ++x);
    // prints 11
    printf("%dn" x);
}

--xx--也可以这样做。 有关详细信息,请参阅此相关问题。

这些是后递增运算符;它们在操作生效,因此在操作中使用 3 和 7。

您正在执行后增量 ( i++ (,它首先获取i的值,然后只增加它的值。

如果你想实现你在问题中所说的,这样做:++w | ++z

x++ x递增,但它的计算结果是旧的值w

因此,w++|z++计算结果为 3|7(在您的实现中恰好是 7(,并将w递增和z作为副作用。

如果你想要你期望的行为,你可以使用前缀运算符++x ,它递增其x并计算到新的值 x

您可能误解了初学者中很常见的post-increment运算符,所以不用担心。随着时间的推移,你会做对的。

看看post-increment这个词。里面有一个post词,一般表示after。这意味着增量将在执行其他所有内容after发生。这就是我过去记忆的方式。

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

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

那么很明显,在执行printf函数本身之后,增量将发生。所以你会得到wz的值分别为37,分别在计算printf的第二个参数表达式。

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

后缀 ++ 表达式的值是其操作数的值。[注:获得的值是原始值的副本 — 尾注]

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