gpt4 book ai didi

c - 后缀增量运算符评估

转载 作者:行者123 更新时间:2023-11-30 20:45:46 27 4
gpt4 key购买 nike

后缀递增/递减运算符是在表达式求值之后还是在整个语句求值之后求值?

#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 在 a||b 计算之前就已经递增(即 b 在计算表达式 b++ 后立即递增)

我在这里读到Incrementing in C++ - When to use x++ or ++x?后缀增量/减量在整个语句之后计算。

哪个是正确的?

最佳答案

函数参数的求值顺序未指定。在将控制传递给被调用函数之前,将应用与参数求值相关的所有副作用。

来自 C 标准(6.5.2.2 函数调用)

10 There is a sequence point after the evaluations of the function designator and the actual arguments but before the actual call.

这是一个演示程序

#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 中有四个运算符。它们是逻辑与运算符 (&&)、逻辑或运算符 (||)、逗号运算符 (,) 和条件运算符 (?:)。

例如

#include <stdio.h>

int main(void)
{
int x = 0;

printf( "x = %d\n", x++ == 0 ? x : x - 1 );
}

程序输出为

x = 1

表达式x++ 求值的副作用在求值之前对表达式x 进行排序,之后是?标志。

关于c - 后缀增量运算符评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46769486/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com