免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 16484 | 回复: 36
打印 上一主题 下一主题

[C++] 为何使用cout不能输出volatile变量的地址? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-07 13:46 |只看该作者 |倒序浏览
#include<iostream>
using namespace std;

int main()
{
volatile int i = 0;
volatile float ic = 0;

volatile double iv = 0;
cout<<&i<<" "<<&ic<<" "<<&iv<<endl;
system("pause");

return 0;
}

就是上面这段代码,为何输出地址都为1?

小弟新手,还请大虾指点~~
警告信息如:warning C4305: 'argument' : truncation from 'volatile int *__w64 ' to 'std::_Bool'

[ 本帖最后由 Anno_Domini 于 2009-4-8 12:38 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-07 14:32 |只看该作者
自顶一个,我就是想问volatile关键字声明的变量为什么不能取地址呢?

论坛徽章:
0
3 [报告]
发表于 2009-04-07 14:47 |只看该作者
其实我对volatile很熟悉,但是看不明白你的cout

论坛徽章:
0
4 [报告]
发表于 2009-04-07 15:03 |只看该作者
volatile是易变的,主要用来修饰const类型变量;
因为const常量,编译器把初始值读进寄存器后就不在初始化,这也是编译器的优化,现在为了不让编译器偷懒,在const前加volatile变量,这样在每次涉及const常量时,编译器就要检查变量的值!

论坛徽章:
0
5 [报告]
发表于 2009-04-07 15:03 |只看该作者

回复 #3 prolj 的帖子

cout 输出变量地址~~

论坛徽章:
0
6 [报告]
发表于 2009-04-07 15:05 |只看该作者

回复 #5 Anno_Domini 的帖子

变量地址和你的值有啥关系?
跟volatile又有啥关系?

论坛徽章:
0
7 [报告]
发表于 2009-04-07 15:06 |只看该作者

回复 #4 chary8088 的帖子

关键字的意义我有一些了解,在此只是关注为何不能输出用其修饰的变量的地址,若是输出一般变量或者是const变量的地址cout<<&var根本没有问题~请赐教。。

论坛徽章:
0
8 [报告]
发表于 2009-04-07 15:12 |只看该作者

回复 #6 prolj 的帖子

我的意思是为什么不能获得volatile变量的地址,输出结果总是1;而如果不用volatile修饰的话,可以返回变量的地址,不知道这个与编译器有没有关系~

论坛徽章:
0
9 [报告]
发表于 2009-04-07 16:06 |只看该作者
VC 2008 Express,警告信息。
  1. ------ 已启动生成: 项目: a, 配置: Debug Win32 ------
  2. 正在编译...
  3. a.cpp
  4. c:\documents and settings\administrator\桌面\a\a.cpp(11) : warning C4305: “参数”: 从“volatile int *”到“std::_Bool”截断
  5. c:\documents and settings\administrator\桌面\a\a.cpp(11) : warning C4800: “volatile int *”: 将值强制为布尔值“true”或“false”(性能警告)
  6. c:\documents and settings\administrator\桌面\a\a.cpp(11) : warning C4305: “参数”: 从“volatile float *”到“std::_Bool”截断
  7. c:\documents and settings\administrator\桌面\a\a.cpp(11) : warning C4800: “volatile float *”: 将值强制为布尔值“true”或“false”(性能警告)
  8. c:\documents and settings\administrator\桌面\a\a.cpp(11) : warning C4305: “参数”: 从“volatile double *”到“std::_Bool”截断
  9. c:\documents and settings\administrator\桌面\a\a.cpp(11) : warning C4800: “volatile double *”: 将值强制为布尔值“true”或“false”(性能警告)
  10. 正在编译资源清单...
  11. Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
  12. Copyright (C) Microsoft Corporation.  All rights reserved.
  13. 正在链接...
  14. 正在嵌入清单...
  15. Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
  16. Copyright (C) Microsoft Corporation.  All rights reserved.
  17. 生成日志保存在“file://c:\Documents and Settings\Administrator\桌面\a\Debug\BuildLog.htm”
  18. a - 0 个错误,6 个警告
  19. ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
复制代码

顺便说一下,声明的是 float ,就别给 int 值。和本问题无关,和代码风格有关。
搭车问一下,行号怎么弄出来。

论坛徽章:
0
10 [报告]
发表于 2009-04-07 16:14 |只看该作者

回复 #9 prolj 的帖子

代码风格的问题我的确该注意,受教,可你还是没有回答我的问题,为什么会发生截断?至于行号应该可以在选项里设置,或者跟debug的宏相关,我不得而知。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP