今天在阅读《码出高效》的时候看到了一个问题,我也是第一次知道,而且有点颠覆我的认知。所以做了一些测试,并记录下来。
然而测试的结果发现,好像事实并不如书中说的那么简单。
问题是这样的:
if (true) int x;
for (; ; ) int y;
while (true) int z;
这三句话,能通过编译吗,如果能,会给出 Warning 吗,如果不能,那么错误信息是什么。
书中给出的答案是,不能通过编译,会给出 Declaration not allowed here 编译错误信息,并对此,书中解释为:
单语句在没有加大括号的情况下,声明的变量不可能再被使用,编译器认为没有任何意义。
Every declaration that introduces a name has a scope, in which they can be used.
我做了一些测试,发现事情好像并不是那么简单。
我一开始也是这样认为的。我本来以为,至少应该通过编译,最多是给一个 Warning 说 variable is never used
。
我比较好奇,除了 Java,其他语言会不会有同样的编译错误。
首先是是测试 C、C++、Java 是不是都对这句话