gpt4 book ai didi

c - 函数调用中参数的评估顺序?

转载 作者:太空狗 更新时间:2023-10-29 16:57:59 25 4
gpt4 key购买 nike

我正在研究 C 中的未定义行为,我得出了一个声明

there is no particular order of evaluation of function arguments

但是像 _cdecl_stdcall 这样的标准调用约定呢,它们的定义(在一本书中)说参数是从右到左求值的。

现在我对这两个定义感到困惑,一个根据 UB,状态不同于另一个根据调用约定的定义。请证明两者的合理性。

最佳答案

作为Graznarak's answer正确地指出,评估参数的顺序不同于传递参数的顺序。

ABI 通常只适用于参数传递的顺序,例如使用哪些寄存器和/或参数值被压入堆栈的顺序。

C 标准所说的是评估的顺序是未指定的。例如(记住 printf 返回一个 int 结果):

some_func(printf("first\n"), printf("second\n"));

C 标准说这两条消息将按一些 顺序打印(计算不是交错的),但没有明确说明选择哪个顺序。它甚至可以在不违反 C 标准的情况下从一个调用到下一个调用有所不同。它甚至可以评估第一个参数,然后评估第二个参数,然后将第二个参数的结果压入堆栈,然后将第一个参数的结果压入堆栈。

ABI 可能会指定使用哪些寄存器来传递这两个参数,或者确切地将值推送到堆栈的哪个位置,这完全符合 C 标准的要求。

但即使 ABI 实际上需要评估以指定的顺序发生(例如,打印 "second\n" 后跟 "first\n" 将违反 ABI),但仍与 C 标准一致。

C 标准所说的是C 标准本身 没有定义求值顺序。一些二级标准仍然可以免费这样做。

顺便说一句,这本身并不涉及未定义的行为。在某些情况下,未指定的评估顺序可能导致未定义的行为,例如:

printf("%d %d\n", i++, i++); /* undefined behavior! */

关于c - 函数调用中参数的评估顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22616986/

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