在Stroustrup的The C++ Programming Language:Special Edition(3rd Ed)中,Stroustrup写道,控制语句条件中的变量声明和初始化不仅是允许的,而且是鼓励的.他写道,他鼓励它,因为它将变量的范围缩小到只有它们所需的范围.所以像这样......
if ((int i = read(socket)) < 0) {
// handle error
}
else if (i > 0) {
// handle input
}
else {
return true;
}
Run Code Online (Sandbox Code Playgroud)
...是很好的编程风格和实践.该变量i仅存if在于需要它的语句块中,然后超出范围.
但是,g ++(版本4.3.3 Ubuntu特定编译)似乎不支持编程语言的这个特性,这对我来说是令人惊讶的.也许我只是用一个标志来调用g ++来关闭它(我称之为的标志是-g和-Wall).在使用这些标志进行编译时,我的g ++版本返回以下编译错误:
socket.cpp:130: error: expected primary-expression before ‘int’
socket.cpp:130: error: expected `)' before ‘int’
Run Code Online (Sandbox Code Playgroud)
在进一步的研究中,我发现我似乎并不是唯一一个不支持此编译器的编译器.并且在这个问题中似乎存在一些混淆,因为确切地说语言在语言中是什么标准,以及编译器使用它编译什么.
所以问题是,什么编译器支持这个功能以及需要设置哪些标志才能编译?这是某个标准而不是其他标准的问题吗?
另外,出于好奇,人们普遍认同Stroustrup这是好风格吗?或者这是一种语言的创造者在他脑海中获得一个想法的情况,这个想法不一定得到语言社区的支持?
而不是......
int value = get_value();
if ( value > 100 )
{
// Do something with value.
}
Run Code Online (Sandbox Code Playgroud)
......是否可以将价值范围缩小到只需要的地方:
if ( int value = get_value() > 100 )
{
// Obviously this doesn't work. get_value() > 100 returns true,
// which is implicitly converted to 1 and assigned to value.
}
Run Code Online (Sandbox Code Playgroud) 显然,您可以在for循环中放置变量声明:
for (int i = 0; ...
Run Code Online (Sandbox Code Playgroud)
而且我注意到你可以在if和switch语句中做同样的事情:
if ((int i = f()) != 0) ...
switch (int ch = stream.get()) ...
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在while循环中执行相同的操作时:
while ((int ch = stream.get()) != -1) ...
Run Code Online (Sandbox Code Playgroud)
编译器(VC++ 9.0)根本不喜欢它.
这是合规行为吗?有原因吗?
编辑:我发现我可以这样做:
while (int ch = stream.get() != -1) ...
Run Code Online (Sandbox Code Playgroud)
但由于优先规则,这被解释为:
while (int ch = (stream.get() != -1)) ...
Run Code Online (Sandbox Code Playgroud)
这不是我想要的.
Bjarne建议使用if中的条件作为范围限制.特别是这个例子.
if ( double d = fd() ) {
// d in scope here...
}
Run Code Online (Sandbox Code Playgroud)
我很好奇如何以真/假的方式解释声明.
编辑:它在6.3.2.1 C++编程语言中作为推荐.
Edit2:templatetypedefs建议指针,特别是动态强制转换,可能会让人深入了解Bjarnes的建议.
SteveJessop告诉我: - 条件不是表达式它也可以是声明,使用的值是被评估的值.
c++ if-statement type-conversion scoping variable-declaration