鱼C论坛

 找回密码
 立即注册
查看: 2639|回复: 9

[已解决]各位大佬,请问为什么会这个结果

[复制链接]
发表于 2022-11-7 14:52:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不应该是12,11吗?
最佳答案
2022-11-7 14:57:06
本帖最后由 jackz007 于 2022-11-7 14:58 编辑

        编译器不同,表现不同,没有讨论价值
        【VC6】 编译、运行结果
D:\[00.Exerciese.2022]\C>cl x.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

x.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:x.exe
x.obj

D:\[00.Exerciese.2022]\C>x
12 12

D:\[00.Exerciese.2022]\C>
          【gcc】 编译、运行结果
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
13 12

D:\[00.Exerciese.2022]\C>
B}Z87{CX266FXVC${TGSMCI.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-7 14:55:48 | 显示全部楼层

回帖奖励 +5 鱼币

a-- 会先返回 a,再进行自减,a++ 同理。
因此运行的时候,a--会先返回13,再a = a - 1 = 12
而 a++ 先会返回12,再a = 12+1 = 13
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-7 14:57:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-7 14:58 编辑

        编译器不同,表现不同,没有讨论价值
        【VC6】 编译、运行结果
D:\[00.Exerciese.2022]\C>cl x.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

x.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:x.exe
x.obj

D:\[00.Exerciese.2022]\C>x
12 12

D:\[00.Exerciese.2022]\C>
          【gcc】 编译、运行结果
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
13 12

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-7 15:07:27 | 显示全部楼层
tommyyu 发表于 2022-11-7 14:55
a-- 会先返回 a,再进行自减,a++ 同理。
因此运行的时候,a--会先返回13,再a = a - 1 = 12
而 a++ 先会 ...

抱歉,我有点不太明白,返回是输出吗?那为什么a--会先输出13,不应该是12吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-7 15:12:43 | 显示全部楼层
本帖最后由 tommyyu 于 2022-11-7 15:15 编辑
时十陵 发表于 2022-11-7 15:07
抱歉,我有点不太明白,返回是输出吗?那为什么a--会先输出13,不应该是12吗?


--a 会先返回12,而 a-- 会先返回 13。

这个好像就是语法,不同的 C 版本的运行结果可能会不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-7 15:15:00 | 显示全部楼层
时十陵 发表于 2022-11-7 15:07
抱歉,我有点不太明白,返回是输出吗?那为什么a--会先输出13,不应该是12吗?

但是一般都不要用这种语法,因为这种代码的返回值不确定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-7 15:47:37 | 显示全部楼层
这种写法除非最好避免。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-8 20:11:22 | 显示全部楼层
这个应该是和参数的传递顺序有关,我好像记得小甲鱼老师说过,一般是从右向左传递的
先传递了a++这个位置的a,传递时a=12,传递后a++,
再传递a--这个位置的a,这时a=13,传递后a--
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-9 08:31:17 | 显示全部楼层
C语言在语句中是从右到左压栈的,所以语句printf("%d %d",a--,a++);是先将a值传到右边的%d,右边打印12,再自加a=13,然后将a值传到左边的%d,左边打印13,再a自减。总之是从右到左执行语句的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-9 08:39:59 | 显示全部楼层
这种行为应该是未定义的
和 i=1 (++i) + (++i)是一个性质,如果是Java那就是显而易见的5
如果是c语言那么什么牛鬼蛇神都有 谭浩强说是6  但事实是编译器实现不同结果不同,如果实现时候i全部是i的引用,结果就会是 3+ 3 = 6

我浅显的认为 有可能是编译器对参数传递顺序不同,
这是这个编译器的逗号运算符先算的后面再算的前面 即先算a++ 返回 12, a= 13 a-- 返回13,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 16:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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