关于关键字volatile使用

其实关键字volatile大家的说法都差不多,但是很少有一个简单的程序来观测结果或者说状态

OK,上个简单的程序,在这里将很好的说明volatile关键字 1 #include <stdio.h>
 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     volatile int z = 1;
 6     int m = (++z) + (++z) + (++z);
 7 
 8     printf("m = %d\n", m);
 9 
10     return 0;
11 }
12 

如果不加上volatile关键字,在不同的编译器下有不同的结果,有的是10,有的是12,
加上volatile关键字后在gcc上就能得到正常的结果了,但是在VC下依旧不能得到想要的结果,一直没
也没想通为什么,希望知道结果的通知回帖。

posted on 2011-06-17 11:59 Hallelujah 阅读(2044) 评论(8)  编辑 收藏 引用 所属分类: C++学习

评论

# re: 关于关键字volatile使用 2011-06-17 13:49 天衣有缝

gcc-4.4.4

不加volatile结果是10
加上结果是9

vc编译器应该是在 int m = (++z) + (++z) + (++z);语句 之前设置寄存器遍历保存3次++的结果,然后再参与计算。所以得到12

所以这段代码加上volatile仍然是没有移植性的  回复  更多评论   

# re: 关于关键字volatile使用 2011-06-17 13:51 airtrack

这个跟volatile没关系的,int m = (++z) + (++z) + (++z);这个东西的求值顺序标准没有规定,不同编译器的实现是不同的。  回复  更多评论   

# re: 关于关键字volatile使用 2011-06-17 14:24 Hallelujah

@airtrack
肯定的,编译器实现不同,得到了不同的结果,问题是在gcc下,如果不加volatile产生的结果和加上就是不一样  回复  更多评论   

# re: 关于关键字volatile使用 2011-06-17 14:31 Hallelujah

谢谢你的评论,我也认为没有可移植性,但是至少在Linux下用gcc编译器是可行的@天衣有缝
  回复  更多评论   

# re: 关于关键字volatile使用 2011-06-17 14:35 airtrack

“加上volatile关键字后在gcc上就能得到正常的结果了”什么是你想要的正常结果?既然标准既没有规定求值顺序,那你的想要的"正常结果"即使在你使用了某种特殊的方法后得到了,那换了一个编译器之后也不一定就是你想要的。标准没有规定求值顺序,决定权自然是有各个编译器掌握,而gcc自然有权利决定加volatile和不加volatile的结果是否相同。  回复  更多评论   

# re: 关于关键字volatile使用[未登录] 2011-06-17 14:53 nscboy

@airtrack
我觉得也是这样.
但C++标准没有规定该操作是未定义的.所以大家还可以使用运算符先后顺序进行演算.最后得出一个"正确"的结论.并可以要求编译器支持
未定义的表达式为:
z = (++z) + (++z) + (++z);
这个表达式就仁者见仁,智者见智了.  回复  更多评论   

# re: 关于关键字volatile使用 2011-06-18 18:01 哈哈爱护的吧

你用了C语言里的未定义行为  回复  更多评论   

# re: 关于关键字volatile使用 2011-06-21 09:48 lugesot

volatile会对程序结果产生影响。但(++z) + (++z) + (++z)确实是没有标准的,标准没有定义,这个写法,据说已经公认地被禁止了。也就是说,是很臭的写法。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年6月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

常用链接

留言簿(1)

随笔分类(15)

随笔档案(14)

最新随笔

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜