chenhuhu 发表于 2022-12-12 17:59:49

有大佬可以讲一下这个程序运行的步骤和为什么得出那个结果吗?

本帖最后由 chenhuhu 于 2022-12-12 17:59 编辑

javascript:;

zhangjinxuan 发表于 2022-12-12 17:59:50

#include <stdio.h>
int func(int a, int b) {
        int c = a + b;
        printf("a = %d, b = %d\n", a, b);
        return c;
}
int main()
{
        int x = 6, y = 7, z = 8, r, a, b, c;
        r = func((x--, y--, x + y), z--);
        a = x;
        b = y;
        printf("r = %d, a = %d, b = %d, z = %d\n", r, a, b, c)
    return 0;
}
现在,x, y, z 的值分别是 6, 7, 8。 r, a, b, c 未知

当执行一条语句时:
r = func((x--, y--, x + y), z--);

我们先明白 func 的两个参数是什么, x--, y-- 过后 x, y 变成了 5, 6,所以 x + y = 11,因为逗号运算符仅返回最后一个表达式的值,所以 func 的第一个实参就是 11

第二个很简单,就是 8, 因为 z-- 应该是 func 执行完了之后再自减

所以,func 的参数分别为 8, 11,故, func 函数应该打印 a = 8, b = 11,并且返回 19,r 就赋值为了 19

a = x;
b = y;
a 就等于 8, b 就等于 11

printf("r = %d, a = %d, b = %d, z = %d\n", r, a, b, z);
r, a, b 分别是 19, 5, 6。 z 前面自减过,所以 z 等于 7

整个程序需分析完了,应该打印:
a = 11, b = 8
r = 19, a = 5, b = 6, z = 7

您的结果可能和我不一样,因为这个在不同的系统有不同的结果,因为处理的方式不同,这个仅供参考

tommyyu 发表于 2022-12-12 18:06:53

这是未定义行为,不同编译器结果不一样,讨论这个问题没有意义
页: [1]
查看完整版本: 有大佬可以讲一下这个程序运行的步骤和为什么得出那个结果吗?