在计算表达式之后或在评估整个语句之后评估后缀递增/递减运算符吗?
#include<stdio.h>
void main()
{
int a=0;
int b=0;
printf("%d %d",a||b,b++); // Output is 1 0
}
我的编译器从右到左评估printf参数。表达式a || b的答案是1,这意味着b在评估|| b之前已经递增(即b在评估表达式b ++之后立即递增)
我在这里阅读Incrementing in C++ - When to use x++ or ++x?,在整个语句之后评估后缀增量/减量。
哪个是对的?
答案 0 :(得分:6)
未指定函数参数的评估顺序。在将控制传递给被调用函数之前,应用与参数评估相关的所有副作用。
从C标准(6.5.2.2函数调用)
10在评估函数后有一个序列点 指定者和实际参数,但在实际调用之前。
这是一个示范程序
#include <stdio.h>
struct
{
int x;
} a = { 0 };
void f( int x )
{
printf( "x = %d\n", x );
printf( "a.x = %d\n", a.x );
}
int main(void)
{
f( a.x++ );
}
它的输出是
x = 0
a.x = 1
由于此调用中的副作用,因此一个参数依赖于其他参数的副作用,并且副作用的评估不确定地相对于参数排序
printf("%d %d",a||b,b++);
程序有未定义的行为。
在操作数评估之间对副作用进行排序时,C中有四个运算符。它们是逻辑AND运算符(&amp;&amp;),逻辑OR运算符(||)逗号运算符(,)和条件运算符(?:)。
例如
#include <stdio.h>
int main(void)
{
int x = 0;
printf( "x = %d\n", x++ == 0 ? x : x - 1 );
}
程序输出
x = 1
在评估表达式x++
之前,对表达式x
的评估的副作用进行了测序。登录。
答案 1 :(得分:0)
您链接的问题的最佳答案是不准确的。 x++
中的增量仅在确定表达式的值之后发生,有时在评估包含表达式之前发生,但是在发生时没有其他保证。
特别是,由于对同一函数调用的参数的副作用是不确定的,因此该程序具有未定义的行为。