use*_*245 2 c increment operator-precedence postfix-operator
我正在使用C运算符优先级表来更好地理解C的运算符优先级.我在理解以下代码的结果时遇到问题.
int a, b;
a = 1;
b = a++; // does not seem to follow C operator precedence
Run Code Online (Sandbox Code Playgroud)
使用C运算符的优先级表,我无法解释为什么使用postfix ++运算符,首先计算赋值,然后计算增量.
后缀增量运算符(++)在C中具有最高优先级,赋值运算符(=)具有最低优先级.所以在上面的代码中,第一个postfix ++必须执行然后赋值=.为此两个变量a和b应等于2,但他们没有.
为什么C运算符优先级似乎不适用于此代码?
postfix ++的最高优先级何时显示?
这与优先权无关.这是后缀++运算符如何工作的问题.
后缀++运算符求值为其操作数的当前值,并具有递增其操作数的副作用.相反,前缀++运算符计算其操作数的递增值.
int a, b;
a = 1;
b = a++; // b is 1, a is 2
b = ++a; // b is 3, a is 3
Run Code Online (Sandbox Code Playgroud)
后缀++运算符的这种行为记录在C标准的 6.5.2.4p2节中:
后缀
++运算符的结果 是操作数的值.作为副作用,操作数对象的值递增(即,将相应类型的值1添加到其中). 有关约束,类型和转换以及操作对指针的影响的信息,请参阅加法运算符和复合赋值的讨论.在更新操作数的存储值的副作用之前,对结果的值计算进行排序.对于不确定顺序的函数调用,后缀的操作++是单个评估.++具有原子类型的对象上的Postfix 是具有memory_order_seq_cst内存顺序语义的读取 - 修改 - 写入操作.
前缀++运算符在6.5.3.1p2节中介绍:
前缀
++运算符的操作数的值 递增. 结果是增量后操作数的新值. 表达式++E相当于(E+=1).有关约束,类型,副作用和转换以及操作对指针的影响的信息,请参阅加法运算符和复合赋值的讨论.
优先级仅确定在解析期间哪些运算符与哪些操作数分组。它不控制评估顺序。++具有比 only 更高的优先级=意味着被b = a++解析为b = (a++)而不是(b = a)++。
运算++符(一元和后缀形式)都有一个结果和一个副作用。在表达式 中b = a++,的结果a++是 的当前值a- 这就是分配给 的值b。的副作用是a++给 加上1 a。
分配b和更新a发生的顺序未指定。最直接的就是
b <- a
a <- a + 1
Run Code Online (Sandbox Code Playgroud)
但以下情况也是允许的:
tmp <- a
a <- a + 1
b <- tmp
Run Code Online (Sandbox Code Playgroud)
的结果++a是当前值a加1,副作用是加1 a。 不要假设在类似的表达式之前b = ++a已a更新b。同样,评估的顺序可能类似于
b <- a + 1
a <- a + 1
Run Code Online (Sandbox Code Playgroud)
实际的评估顺序取决于您的编译器、优化设置,甚至周围的代码。
强制从左到右计算表达式的唯一运算符是&&、||、?:和逗号运算符。