鱼C论坛

 找回密码
 立即注册
查看: 2820|回复: 2

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

[复制链接]
发表于 2022-12-12 17:59:49 | 显示全部楼层 |阅读模式
8鱼币
本帖最后由 chenhuhu 于 2022-12-12 17:59 编辑

javascript:;
最佳答案
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

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

源代码

源代码

最佳答案

查看完整内容

现在,x, y, z 的值分别是 6, 7, 8。 r, a, b, c 未知 当执行一条语句时: 我们先明白 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 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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

您的结果可能和我不一样,因为这个在不同的系统有不同的结果,因为处理的方式不同,这个仅供参考
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-12 18:06:53 | 显示全部楼层
这是未定义行为,不同编译器结果不一样,讨论这个问题没有意义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 08:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表