能力值:
( LV2,RANK:10 )
|
-
-
2 楼
不是编译器的bug,是代码的bug。
无论是c还是c++标准都没有规定函数参数的求值顺序,这是未定义行为,编译器可以自己决定怎么做,你的这行代码在这里就会出现二义,debug下选择了从左向右求值,而release下恰好相反。
多说一句,函数参数的求值顺序与压栈顺序完全无关,不要搞混了。
|
能力值:
( LV12,RANK:250 )
|
-
-
3 楼
只有所谓“正规”的教育机构才会培育出这种无聊的题目。
|
能力值:
( LV13,RANK:240 )
|
-
-
4 楼
*和++同一级别
也肯定是7
*p1 取出p1里面的值 *p1=7;
而后p1++
|
能力值:
( LV13,RANK:240 )
|
-
-
5 楼
再详细一点。
debug模式
所有的代码都不会被优化修改。
*p1++先执行了*p1
因此结果一定是7
然后p1++
再执行了*p1
结果是18
release模式下优化后的代码直接看
00EB1000 >/$ 6A 07 PUSH 7 ; /<%d> = 7
00EB1002 |. 6A 07 PUSH 7 ; |<%d> = 7
00EB1004 |. 68 0021EB00 PUSH OFFSET release.??_C@_0N@DPBMGHGC@?$>; |format = "*p1++:%d,%d
"
00EB1009 |. FF15 9420EB00 CALL DWORD PTR DS:[<&MSVCR120.printf>] ; \printf
00EB100F |. 83C4 0C ADD ESP,0C
00EB1012 |. FF15 9020EB00 CALL DWORD PTR DS:[<&MSVCR120.getchar>] ; [getchar
00EB1018 |. 33C0 XOR EAX,EAX
00EB101A \. C3 RETN
直接push了两个7 然后直接输出
造成了这样的结果
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
这是未定义行为, 编译器怎么做都是合乎标准的, 私以为没有什么意义...
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
同6楼
在printf语句中使用++ --是致命的
|
能力值:
( LV12,RANK:340 )
|
-
-
8 楼
原来如此,一直以为求值和压栈顺序是一样的。
|
能力值:
( LV12,RANK:340 )
|
-
-
9 楼
百度查的C运算符优先级中取值[*]与自增[++]运算符的确同一优先级。
但是MSDN里却不太一样: 计算的优先级和顺序
MSDN中提到,后置++、--是最高优先级。
而前置++、--则与取值[*]优先级相同。
不知道这玩意应该以哪个为标准呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
这种题目 我觉得一点都不无聊。
对于undefined 的及早认识是好事啊。
否则写了一个未定义的代码出来出错时还以为是BUG。
不过如果题目 只是为了问答案,而不是为了问“未定义 ” 那就无聊了
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
测试了下其它的编译器:
g++:debug版本:7,18;release版本:7,7
Intel c++:debug版:7,18;release版:7,18
|
|
|