
main() { int i = 10, j=10; int a = ++i+j++; int b = j--; printf("%d ,%d\n", a, b); //显然,此处输出为 21 ,11 } 但是以下代码:
main() { int i = 10, j=10; printf("%d ,%d\n", ++i+j++, j--); //此处在 Linux ( Debian9) 使用 GCC //以及 Windows 下使用 code blocks (应该是 MinGW 的 gcc )输出是 20,10 ; //而 macOS ( Mojave )下使用 gcc,输出是 21,11 } 这是为什么?我原本自己推测也应该是 21,11
1 momocraft 2019-02-06 21:32:45 +08:00 c 有定多被求值的序, 的直接回答只能是"因器做". 不要面向巧合程. |
2 everwanna 2019-02-06 21:35:38 +08:00 via iPhone 不建议写这样的代码。coding 的成就感来自于创造性的解决现实问题,而不是和编译器 CPU 捉迷藏 |
3 ipwx 2019-02-06 21:41:34 +08:00 如果你要准备某个考试,就按答案来。 C/C++ 标准并没有规定这方面的内容,是为了让各个编译器有充分自主的空间去优化最终程序。 所以不要写这样的代码。 |
4 shintendo 2019-02-06 21:43:15 +08:00 编程不是实验科学,编程有个概念是“未定义行为”。 https://bbs.csdn.net/topics/370153775 |
5 inhzus 2019-02-06 21:45:12 +08:00 via Android 编译器不同,printf 的运算顺序不同,所以尽量避免写这样的代码。 解释一下 20,10 从右往左,j--,输出 10,j=9 ++i+j,输出 20,最后 j++ |
6 nyse OP |
7 sdijeenx 2019-02-06 21:48:03 +08:00 对于:printf("%d ,%d\n", ++i+j++, j--); // MinGW 的 gcc 先计算 j--,再计算++i+j++; // macOS Mojave gcc 先计算++i+j++,再计算 j--。 |
8 skinny 2019-02-07 09:41:17 +08:00 这种考试题挺脑残的……特别是编译器到现在还是 Turbo C …… |
9 MrVito 2019-02-07 10:55:02 +08:00 看看 gcc 的版本吧 |
11 jedihy 2019-02-08 08:39:18 +08:00 这样的代码不是 human readable 的 |
12 unlighted 2019-02-08 13:16:30 +08:00 via iPhone 压栈的时候,从右往左压,后缀的增减会被保留到最后进行计算,++i+j-- 这个时候就是 11+9,j++之后因为有 j--,所以被抵消了,即为 10 |
13 NULLSTRING 2019-02-13 15:02:53 +08:00 |
14 junkman 2019-02-13 19:52:05 +08:00 If you using -Wall to compile above code, you would see multiple unsequenced modifications warning. ``` $ gcc -Wall foobar.c foobar.c:6:29: warning: multiple unsequenced modifications to 'j' [-Wunsequenced] printf("%d ,%d\n", ++i+j++, j--); ^ ~~ 1 warning generated. ``` In short, as @momocraft aforementioned, parameter evaluation order is unspecified, it depends on compiler implementation, i.e. it can be LR-evaluated or RL-evaluated. BTW, above code is extremely EVIL, as a guideline, [Don't be evil]( https://en.wikipedia.org/wiki/Don%27t_be_evil) see: https://stackoverflow.com/questions/34266773/language-c-compile-time-error-multiple-unsequenced-modifications-werror-wun |