鱼C论坛

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

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

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

javascript:;
最佳答案
2022-12-12 17:59:50
  1. #include <stdio.h>
  2. int func(int a, int b) {
  3.         int c = a + b;
  4.         printf("a = %d, b = %d\n", a, b);
  5.         return c;
  6. }
  7. int main()
  8. {
  9.         int x = 6, y = 7, z = 8, r, a, b, c;
  10.         r = func((x--, y--, x + y), z--);
  11.         a = x;
  12.         b = y;
  13.         printf("r = %d, a = %d, b = %d, z = %d\n", r, a, b, c)
  14.     return 0;
  15. }
复制代码

现在,x, y, z 的值分别是 6, 7, 8。 r, a, b, c 未知

当执行一条语句时:
  1. 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

  1. a = x;
  2. b = y;
复制代码

a 就等于 8, b 就等于 11

  1. printf("r = %d, a = %d, b = %d, z = %d\n", r, a, b, z);
复制代码

r, a, b 分别是 19, 5, 6。 z 前面自减过,所以 z 等于 7

整个程序需分析完了,应该打印:
  1. a = 11, b = 8
  2. 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 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-12 17:59:50 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. int func(int a, int b) {
  3.         int c = a + b;
  4.         printf("a = %d, b = %d\n", a, b);
  5.         return c;
  6. }
  7. int main()
  8. {
  9.         int x = 6, y = 7, z = 8, r, a, b, c;
  10.         r = func((x--, y--, x + y), z--);
  11.         a = x;
  12.         b = y;
  13.         printf("r = %d, a = %d, b = %d, z = %d\n", r, a, b, c)
  14.     return 0;
  15. }
复制代码

现在,x, y, z 的值分别是 6, 7, 8。 r, a, b, c 未知

当执行一条语句时:
  1. 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

  1. a = x;
  2. b = y;
复制代码

a 就等于 8, b 就等于 11

  1. printf("r = %d, a = %d, b = %d, z = %d\n", r, a, b, z);
复制代码

r, a, b 分别是 19, 5, 6。 z 前面自减过,所以 z 等于 7

整个程序需分析完了,应该打印:
  1. a = 11, b = 8
  2. r = 19, a = 5, b = 6, z = 7
复制代码


您的结果可能和我不一样,因为这个在不同的系统有不同的结果,因为处理的方式不同,这个仅供参考
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-12-12 18:06:53 | 显示全部楼层
这是未定义行为,不同编译器结果不一样,讨论这个问题没有意义
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 22:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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