"一个让诸位喷血而死的发现!!"续集 :)
前传:)http://expert.csdn.net/Expert/topic/2204/2204860.xml?temp=4.139346E-02
由于只能回复三十次,只好结帖.不过既然还有人关心,我就再发一贴:
Class struct是 非执行体,指的是
Class a
{
int I;
int j;//永远不能debug到这,因为这不是语句
};
即那是”宣告”,不是”定义”
int foo();//宣告
int foo()
{
…
}//定义
...........................................................................
class a
{
int I;
;;;;
int j
};//的确不影响执行效率,但影响编译效率
..............................................................................
yaoxinyan() 的论点:
首先由C语言讲起,C的语法里面,declaration和statement是不同的,在函数体的外部只能有declaration而不能有statement:
int i; //declaration. 合法的C代码
int main(){}
; //statement(null statement). 不合法的C代码
int main(){}
因此,单独一个“;”(即null statement)不能写在函数体的外面。这个大家理解起来应该没问题。
好,论到C++了。C++在刚出道的时候就支持一个新特性,内部变量可以在block的任何地方出现,这个特性方便程序员在真正用到的时候才声明内部变量:
int main()
{
int i=0;
f();
int g=g(); //合法的C++代码
++i;
double d; //合法的C++代码
...
}
相信大家对这个并不陌生,复合语句的loop部分很自然也是block的序列,于是在C++还可以这样:
for(int i=0; i<100; ++i){ ... }
上面for语句的iterator(即i)由于在block里面,因此可以到进入for的loop部分才声明i,C没有这项特性,C程序员必须这样写:
int i;
for(i=0; i<100; ++i){ ... }
好,一个问题现在就摆在C++的设计者面前:
这样的代码大量存在:
int i=0;
for( ; i<100; ++i){ ... }
看到那个null statement吗?在C里面,这种写法是合法的,C++没理由不支持。
如何实现declaration的语法呢?一方面,如果像C语言那样把declaration和statement截然分开,显然不行,因为这样就无法实现“随处声明内部变量的特性”;另一方面又要顾及到不能到处写statement,明显错的应该仍然是错的:
int i=0;
++i; //这明显是错的!
int main(){}
最后,C++的设计者基于各种考虑,采取了一种折中而又不失效率的做法:
把declaration处理成statement的一种,并且允许出现declaration的地方也就允许出现null statement,
这样就解决了问题:
1)可以“随地大小便”啦
int main()
{
int i;
++i;
int j; //合法的C++,因为declaration是statement,
//既然这里可以写statement也就意味着写declaration是合法的
--j;
}
2)兼容好又效率高
for (int i=0;i<100;++i){ ... }
和
int i=0;
for ( ; i<100; ++i){ ... }
要同样被接受。OK,本来null statement可以出现的地方就允许declaration出现(记住,declaration也是statement),现在写declaration的地方又要求可以接受null statement,既然这样,索性把null statement与declaration等价!于是,便出现了令yjh1982 (血精灵)吐血的一幕:
; //合法的C++代码!
int main(){}
class A
{ int i; ; ;;;}; //合法的C++代码!
3)危害性为零
declaration与null statement等价是出于提高效率的考虑(恰恰与yjh1982 (血精灵)的抱怨相反),注意,只有null statement才享有这个特权!那些明显错的还是错的:
int i=9;
++i; //小子,你又不是null statement,你站在这干嘛?!
//(你忘记了,我是那个印度阿三啊……)
int main(){}
到此,水落石出,不要义愤填膺地指责C++在declaration的地盘接受那些“无用的家伙”——null statement,事实恰恰是C++为了提升编译效率而又考虑到无损大局而接纳了null statement。
最后,补充知识:ISO C99已经允许C程序员在block里面随处声明内部变量:
int main()
{
int i=0;
++i;
int j=i; //合法的C++、C99代码。
--j;
}
…………………………………………..................................................................................................................
告诉的是”int I;”可当成语句,但我认为class 中的”int I”不是语句,是”宣告”.
现在我想通一些了:
class a
{
static const int i=0;
int j;
};
是为了使编译器解析不至于太复杂而作的妥协:(
........................................
另外我在那公司时脑子也不灵光:),原由请见:
http://expert.csdn.net/Expert/topic/2331/2331773.xml?temp=.9221155