时十陵 发表于 2022-11-7 14:52:01

各位大佬,请问为什么会这个结果

不应该是12,11吗?

tommyyu 发表于 2022-11-7 14:55:48

a-- 会先返回 a,再进行自减,a++ 同理。
因此运行的时候,a--会先返回13,再a = a - 1 = 12
而 a++ 先会返回12,再a = 12+1 = 13

jackz007 发表于 2022-11-7 14:57:06

本帖最后由 jackz007 于 2022-11-7 14:58 编辑

      编译器不同,表现不同,没有讨论价值
      【VC6】 编译、运行结果
D:\\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:\\C>x
12 12

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

D:\\C>x
13 12

D:\\C>

时十陵 发表于 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吗?

tommyyu 发表于 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 版本的运行结果可能会不一样

tommyyu 发表于 2022-11-7 15:15:00

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

但是一般都不要用这种语法,因为这种代码的返回值不确定

jhq999 发表于 2022-11-7 15:47:37

这种写法除非最好避免。

两手空空儿 发表于 2022-11-8 20:11:22

这个应该是和参数的传递顺序有关,我好像记得小甲鱼老师说过,一般是从右向左传递的
先传递了a++这个位置的a,传递时a=12,传递后a++,
再传递a--这个位置的a,这时a=13,传递后a--

进击的小白M 发表于 2022-11-9 08:31:17

C语言在语句中是从右到左压栈的,所以语句printf("%d %d",a--,a++);是先将a值传到右边的%d,右边打印12,再自加a=13,然后将a值传到左边的%d,左边打印13,再a自减。总之是从右到左执行语句的。

AnisHan 发表于 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,
页: [1]
查看完整版本: 各位大佬,请问为什么会这个结果