1
zhjits 2015 年 7 月 12 日
undefined behavior
|
2
FrankFang128 2015 年 7 月 12 日 via Android 结果就是写这行代码的程序员被开除。
然后把这行重写 |
3
choury 2015 年 7 月 12 日 你学的是谭浩强的C语言吗,要是我们组有人敢写这样的代码,我非得喷死他
|
4
nobodybutme OP @zhjits 我win下codeblocks和linux下gcc跑的都是这个结果。 不同编译器怎么实现的? 比如i的那个,6 7 4 7 怎么得出来的?
|
5
onlyice 2015 年 7 月 12 日
@nobodybutme 看生成的汇编代码,就知道怎样实现了
说实话知道了也没什么用 |
6
chaucerling 2015 年 7 月 12 日
++i的优先级
|
7
lingo233 2015 年 7 月 12 日
这一定是谭浩强C
|
8
zhjits 2015 年 7 月 12 日
@nobodybutme Windows 下面的 codeblocks 自带一个 gcc。
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) 运行结果: 3 5 5 7 3 5 6 7 4 5 6 |
9
zhjits 2015 年 7 月 12 日 @nobodybutme 至于具体编译器怎么实现的可以 RTFM 或者看生成的汇编啊
|
10
johnsmith123 2015 年 7 月 12 日
SB
|
11
loveuqian 2015 年 7 月 12 日 via iPhone
了解这段代码的含义对实际开发帮助不大
|
12
nobodybutme OP @zhjits Thank you! ^_^
|
13
101 2015 年 7 月 12 日
我记得不同的编译器实现是不一样的,类似事例似乎在 TCPL 出现过?
|
14
dndx 2015 年 7 月 12 日
有时间干啥不好非研究这种蛋疼且毫无意义的玩意。
|
15
18000rpm 2015 年 7 月 12 日 你们喷完还是帮人家解决一下问题嘛
LZ 可以参考一下这个 http://docs.linuxtone.org/ebooks/C&CPP/c/ch16s03.html |
16
yksoft1 2015 年 7 月 12 日
不同编译器,不同系统,不同CRT对这个实现都可能不同,因此不要在实际开发中这么写
|
17
XiXiLocked 2015 年 7 月 12 日 这和压栈顺序在概念上是无关的(实现上相关那是另一回事
有关的是参数的计算顺序, 比如printf("%d %d %d\n", ++z, ++z, ++z); 补上计算过程中的临时变量,那就相当于7条无序语句 z+=1; int temp1 = z; z+=1; int temp2 = z; z+=1; int temp3 = z; printf("%d %d %d\n", temp1, temp2, temp3); 除了print必须最后执行,初始化temp必须在z+=1之后,并没有其他约束。所以temp1,2,3的顺序可以换,temp的初始化的时机也可以后延。要出现666只要把3条temp尽量往后挪就行。 再说这样写并不好,虽然我觉得这不是undefined behavior,而是implementation specific behavior,因为我记得语言规范上故意不限定求值顺序是为了方便编译器优化,但不管是哪种,代码已经不受自己控制了。 |
18
en3073 2015 年 7 月 12 日
xcode的答案
3 5 5 7 3 5 6 7 4 5 6 你怎么看? |
19
wy315700 2015 年 7 月 12 日
函数参数是从右往左压栈,但是没有定义是哪个参数先行计算
|
20
Tink PRO 自己算的 3 5 5 7
3 5 6 7 4 5 6 |
21
adadada 2015 年 7 月 12 日 @XiXiLocked +1. ref: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 的 6.5.2.2 节的第 10 点。
|