后缀增量运算符评估

时间:2017-10-16 11:41:17

标签: c parameter-passing operator-precedence expression-evaluation

在计算表达式之后或在评估整个语句之后评估后缀递增/递减运算符吗?

#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?,在整个语句之后评估后缀增量/减量。

哪个是对的?

2 个答案:

答案 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++中的增量仅在确定表达式的值之后发生,有时在评估包含表达式之前发生,但是在发生时没有其他保证。

特别是,由于对同一函数调用的参数的副作用是不确定的,因此该程序具有未定义的行为。