各位大佬,请问为什么会这个结果
不应该是12,11吗? a-- 会先返回 a,再进行自减,a++ 同理。因此运行的时候,a--会先返回13,再a = a - 1 = 12
而 a++ 先会返回12,再a = 12+1 = 13 本帖最后由 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> tommyyu 发表于 2022-11-7 14:55
a-- 会先返回 a,再进行自减,a++ 同理。
因此运行的时候,a--会先返回13,再a = a - 1 = 12
而 a++ 先会 ...
抱歉,我有点不太明白,返回是输出吗?那为什么a--会先输出13,不应该是12吗? 本帖最后由 tommyyu 于 2022-11-7 15:15 编辑
时十陵 发表于 2022-11-7 15:07
抱歉,我有点不太明白,返回是输出吗?那为什么a--会先输出13,不应该是12吗?
--a 会先返回12,而 a-- 会先返回 13。
这个好像就是语法,不同的 C 版本的运行结果可能会不一样 时十陵 发表于 2022-11-7 15:07
抱歉,我有点不太明白,返回是输出吗?那为什么a--会先输出13,不应该是12吗?
但是一般都不要用这种语法,因为这种代码的返回值不确定 这种写法除非最好避免。 这个应该是和参数的传递顺序有关,我好像记得小甲鱼老师说过,一般是从右向左传递的
先传递了a++这个位置的a,传递时a=12,传递后a++,
再传递a--这个位置的a,这时a=13,传递后a-- C语言在语句中是从右到左压栈的,所以语句printf("%d %d",a--,a++);是先将a值传到右边的%d,右边打印12,再自加a=13,然后将a值传到左边的%d,左边打印13,再a自减。总之是从右到左执行语句的。 这种行为应该是未定义的
和 i=1 (++i) + (++i)是一个性质,如果是Java那就是显而易见的5
如果是c语言那么什么牛鬼蛇神都有 谭浩强说是6但事实是编译器实现不同结果不同,如果实现时候i全部是i的引用,结果就会是 3+ 3 = 6
我浅显的认为 有可能是编译器对参数传递顺序不同,
这是这个编译器的逗号运算符先算的后面再算的前面 即先算a++ 返回 12, a= 13 a-- 返回13,
页:
[1]