首页
社区
课程
招聘
[讨论]VC++ Debug和Release版本运行结果不一致的思考。
发表于: 2014-9-15 13:36 9356

[讨论]VC++ Debug和Release版本运行结果不一致的思考。

bxc 活跃值
6
2014-9-15 13:36
9356
最近在测试解指针运算符[*]和后置自增运算符[++]的优先顺序时,无意发现了一个问题。
我的一段代码,在VS 2013 的Debug和Release版本中的运行结果不一致。
猜测之前版本应该也是这样。先上代码:
int _tmain(int argc, _TCHAR* argv[])
{
  int arr[3] = { 7, 18, 32 };
  int *p1 = arr;

  printf("*p1++:%d,%d\n", *p1++, *p1);

  getchar();
  return 0;
}


Debug版本结果:
*p1++:7,18

Release版本结果:
*p1++:7,7


这个问题算不算VC++的Bug呢?
个人认为是编译器优化的原因,但是又不清楚其原理,请大牛们指教。
另外我查的资料显示解指针运算符[*]和后置自增运算符[++]是同一优先级,并且是从右至左结合。
那么按理说第一个应该打印成18才对。但是MSDN上又说后缀运算符在表达式计算中具有最高优先级。不知道怎么判断了。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 1443
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不是编译器的bug,是代码的bug。
无论是c还是c++标准都没有规定函数参数的求值顺序,这是未定义行为,编译器可以自己决定怎么做,你的这行代码在这里就会出现二义,debug下选择了从左向右求值,而release下恰好相反。
多说一句,函数参数的求值顺序与压栈顺序完全无关,不要搞混了。
2014-9-15 13:52
0
雪    币: 399
活跃值: (214)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
3
只有所谓“正规”的教育机构才会培育出这种无聊的题目。
2014-9-15 13:53
0
雪    币: 1392
活跃值: (5207)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
*和++同一级别
也肯定是7
*p1 取出p1里面的值        *p1=7;
而后p1++
2014-9-15 13:55
0
雪    币: 1392
活跃值: (5207)
能力值: ( 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 然后直接输出
造成了这样的结果
2014-9-15 14:03
0
雪    币: 102
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
这是未定义行为, 编译器怎么做都是合乎标准的, 私以为没有什么意义...
2014-9-15 14:23
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
同6楼

在printf语句中使用++ --是致命的
2014-9-15 14:26
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
8
原来如此,一直以为求值和压栈顺序是一样的。
2014-9-15 14:53
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
9
百度查的C运算符优先级中取值[*]与自增[++]运算符的确同一优先级。
但是MSDN里却不太一样:计算的优先级和顺序
MSDN中提到,后置++、--是最高优先级。
而前置++、--则与取值[*]优先级相同。
不知道这玩意应该以哪个为标准呢?
2014-9-15 14:57
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这种题目  我觉得一点都不无聊。  

对于undefined 的及早认识是好事啊。

否则写了一个未定义的代码出来出错时还以为是BUG。

不过如果题目 只是为了问答案,而不是为了问“未定义 ”  那就无聊了  
2014-9-15 15:19
0
雪    币: 941
活跃值: (1264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
测试了下其它的编译器:
g++:debug版本:7,18;release版本:7,7
Intel c++:debug版:7,18;release版:7,18
2014-9-15 18:48
0
游客
登录 | 注册 方可回帖
返回
//