gpt4 book ai didi

有人能解释一下这个 C 代码片段将如何评估 w.r.t 序列点吗?

转载 作者:太空狗 更新时间:2023-10-29 14:58:35 25 4
gpt4 key购买 nike

这是C下的Undefined Behavior吗?我这样说是因为我认为函数 inc(int *k) 可以被认为是一个表达式,其副作用是更新 k 地址处的值。那么,这会使其等同于 i=i++,即 UB 吗?

#include <stdio.h>
/*Edited(See comments below on dbush's answer)*/
int inc(int *k) {return ++(*k);}
/*End of edit*/
int main()
{
int i=0;
int *ptr = &i;
i = inc(ptr);
printf("%d\n", i);
}

最佳答案

该行为定义明确,因为调用函数算作一个序列点,函数中的每个语句也是一个序列点。它就好像函数体被放在它的位置一样。

首先 inc 被调用。这会调用一个序列点。

在函数内,语句return++(*k) 被执行,它首先计算包含的表达式。这导致 main 中的 i 递增到 1,并且表达式求值为 i 的新值,即 1。return 语句从函数返回该值,该语句的完成是另一个序列点,因此递增 i 的副作用保证是完整的。

回到 maininc 返回的值 1 然后被分配给 i

如果你改为这样做:

i = ++(*ptr);

将是未定义的行为,因为在分配给 i 和通过 递增 i 的副作用之间没有序列点*ptr.

关于有人能解释一下这个 C 代码片段将如何评估 w.r.t 序列点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51977318/

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