gpt4 book ai didi

c - 在 C 中调用函数时的序列点和未定义/未指定的行为

转载 作者:太空狗 更新时间:2023-10-29 15:13:26 26 4
gpt4 key购买 nike

我试图确定我对 C 中序列点的理解——只是想检查一下。目前,我认为 (1) 未定义而 (2) 只是未指定,基于在 (2) 中,在评估 gh 的参数后有序列点(所以我们没有在序列点之间修改 i 两次),但是 f 的参数的评估顺序仍然未指定。我的理解正确吗?

#include <stdio.h>

int g(int i) {
return i;
}

int h(int i) {
return i;
}

void f(int x, int y) {
printf("%i", x + y);
}

int main() {
int i = 23;
f(++i, ++i); // (1)
f(g(++i), h(++i)); // (2)
return 0;
}

编辑:

这里的关键点似乎是编译器是否可以在调用 gh 之前自由执行两个增量——我从下面的答案中理解是确实如此,尽管我很乐意确认情况确实如此。

最佳答案

不正确。序列点在允许的操作顺序上指定部分顺序。在情况(2)中,有序列点:

  1. 第(1)行末尾的分号处
  2. g 的参数求值之后(即 ++i)但在调用 g 之前
  3. h 的参数求值之后(即 ++i)但在调用 h 之前
  4. f 的参数求值之后(即在 fg 返回之后)但在调用 f 之前
  5. f返回后

所以部分顺序看起来像这样,从上到下:

    1
/ \
/ \
2 3
\ /
\ /
4
|
|
5

2 和 3 没有相对于彼此排序,因为参数的评估顺序未指定。由于 i 在序列点 1 和 4 之间被修改了两次,因此行为未定义。

关于c - 在 C 中调用函数时的序列点和未定义/未指定的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10999889/

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