Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
增量前的gcc优化&;后增操作_C_Linux_Gcc_Compiler Optimization - Fatal编程技术网

增量前的gcc优化&;后增操作

增量前的gcc优化&;后增操作,c,linux,gcc,compiler-optimization,C,Linux,Gcc,Compiler Optimization,我想知道gcc编译器决定优化变量值的标准是什么。? 这是样品 int a=2; printf("%d %d\n",a++,++a); 它提供输出 34 为什么gcc在增量前而不是增量后优化并给出a的最新值?它是在什么基础上做出决定的?这是未定义的行为。没有指定参数求值的顺序。代码有两个问题 在同一表达式中更改a的值两次,其间没有所谓的“序列点”。这是未定义的行为,任何事情都可能发生 传递给函数的参数有副作用,副作用是++增量。函数参数的求值顺序是未指定的行为,这意味着编译器以某种方式实现了它

我想知道gcc编译器决定优化变量值的标准是什么。? 这是样品

int a=2;
printf("%d %d\n",a++,++a);
它提供输出
34


为什么gcc在增量前而不是增量后优化并给出
a
的最新值?它是在什么基础上做出决定的?

这是未定义的行为。没有指定参数求值的顺序。

代码有两个问题

  • 在同一表达式中更改
    a
    的值两次,其间没有所谓的“序列点”。这是未定义的行为,任何事情都可能发生

  • 传递给函数的参数有副作用,副作用是++增量。函数参数的求值顺序是未指定的行为,这意味着编译器以某种方式实现了它,但我们不知道如何实现。它可能因函数而异,当然也因编译器而异


任何人都不应该编写依赖于未定义或未指定行为的代码

这是未定义的行为,因为在同一个表达式中更改了两次,其间没有序列点。函数参数的求值顺序不是UB,而是未指定的行为。这是两个不同的问题。