gpt4 book ai didi

c - 了解 c 代码在 gcc 编译器上的输出

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:48 26 4
gpt4 key购买 nike

我从这样的几个帖子中了解到 What are all the common undefined behaviours that a C++ programmer should know about? ,该行为未定义并留给编译器。

但是对于给定的代码,输出是 2 1 3(总是,始终如一)

#include<stdio.h>
int main(){
int i = 1;
printf("%d %d %d\n", i++, i++, i);
return 0;
}

所以,我想知道,gcc 遵循什么顺序,看起来不像是从左到右还是从右到左?输出总是一样的,这个问题只与 gcc 4.9.1 编译器有关。

最佳答案

您指定了gcc,所以我将说明一些非常gcc 的内容。

这是未定义的,但是如果你考虑一下 gcc 是如何实现调用堆栈的,你就会知道为什么它是一致的。基本上,堆栈从高地址增长到低地址,并且像 printf 这样的函数在其参数列表中包含 ... 会将参数转储到堆栈中。给定堆栈的方向,没有太多选择:

func(a1, a2, a3, a4);

从左向右推:

high| ... |
| a1 |
| a2 |
| a3 |
low | a4 |

或从右到左:

high| ... |
| a4 |
| a3 |
| a2 |
low | a1 |

事实是,gcc 采用了第二种方法。这听起来可能违反直觉,但考虑到这样的堆栈结构,这是非常好的设计。如果一定要按顺序访问参数,那么自然就这样构成了一个数组,所以arr[0],arr[1]等都会对应到正确的论点。

所以在知道这一点之后,评估顺序就不再难理解了,因为 gcc 以任何方式从右到左处理参数。如果我需要实现一个编译器来处理函数调用,为什么我会选择在这种情况下从左到右处理参数,在那种情况下选择从右到左处理参数?这不仅令人困惑。

gcc 是一个非常全面的编译器,如果您知道它的一些实现的话。一项技术决策通常会导致非常明显的后果。

这是非常 gcc 特定的,所以如果有人改变堆栈的增长方向或者只是想创建特殊情况,事情可能会很容易改变。例如,clang 似乎表现得恰恰相反。

关于c - 了解 c 代码在 gcc 编译器上的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31955038/

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