C++,那些可爱的小陷阱(二)
来源:互联网 发布:程序化交易软件哪个好 编辑:程序博客网 时间:2024/05/01 01:08
这一次,是关于声明的一个小问题:
int j = 24;
int main()
{
int i = j, j;
j = 42;
printf("%d %d\n", i, j);
}
这能通过编译吗?能
这不会产生未定义行为吗?不会
这程序甚至不是ill-formed(ill-formed就是C++支持但不推荐的写法),
输出的结果是:
24 42
这个问题并不难猜到答案,但是大概大部分同学都不敢很肯定地说出来。我们来看看标准如何解释的这个问题:
j这个名字被声明了两次(也使用了两次),第一个j声明的区域涵盖了整个例子,第一个j的潜在可用域从这个j的后面立刻开始一直延伸到程序结束,但是它(实际上)的作用域不包括,和}之间的文本。第二个j声明的区域包括{和}之间的所有文本,但是它的潜在可用域不包括i的声明。第二个j声明的实际作用域和潜在可用域是相同的。 下面我补了一张图,蓝色部分就是第二个j的实际作用域。
int j = 24;
int main()
{
int i = j, j;
j = 42;
printf("%d %d\n", i, j);
}
从上面看出C++声明精确地从声明的点开始有效,但是还有一些特别要注意的地方,这里又有几条C++标准中的小例子,猜猜它们的结果:
{ int x = x; }
{ int i[i]; }
{ enum { x = x }; }
struct X {
enum E { z = 16 };
int b[X::z];
};
答案:
1.第二个x被以它自己的值初始化,变量声明在初始化之前生效。
2.数组i被正确初始成大小2,外层变量直到声明的那一点,都是可见的。
3.enum中的x被正确初始化为12,枚举类型的声明点紧接它的定义之后(也就是,枚举类型声明位于声明生效点之前。)。
4.数组b被正确初始化为大小16,一个类成员的定义点之后,类的域中就能查找到这个名字。
That’s all, thanks.
from: http://www.cnblogs.com/winter-cn/archive/2009/11/18/1605662.html
- C++,那些可爱的小陷阱(二)
- C++,那些可爱的小陷阱(一)
- C++,那些可爱的小陷阱(三)
- 那些可爱的小骨头
- C语言的那些小秘密之指针(二)
- C语言的那些小秘密之【指针(二)】
- C语言的那些小秘密之【链表(二)】
- C陷阱(二)
- 可爱的小动物
- 可爱的小颜色~
- 可爱的小生命
- 可爱的小朋友们
- 那些最可爱的人
- C语言的那些小秘密之链表(二)
- C语言的那些小秘密之链表(二)
- 可爱的python课后习题(二)
- 小心笔试中的小陷阱(二)
- C/C++传地址的小陷阱
- asp.net WebPages 速记1
- java静态代码分析工具FindBugs
- 网页视频需要的格式
- C++,那些可爱的小陷阱(一)
- fatal error CVT1100
- C++,那些可爱的小陷阱(二)
- nginx在多台服务器设置SSL安装过程,包括路由,暂时没有翻译哈,大家直接看着色的部分就好了
- C++,那些可爱的小陷阱(三)
- CoordinatorLayout behavior
- 二、那些年遇见的最逗得老师
- 今天碰到一道比较有趣的面试题,大家来探讨一下。
- SSH框架搭建Struts2.06+spring2.5+hibernate3.2整合实例代码教程步骤
- poj 1113 Wall 【求包围所有点、且与所有点距离至少为L的曲线的最小周长】
- 用putty让windows主机实现内网映射