在斯特鲁斯特鲁普的C++ 编程语言:特别版(第 3 版)Stroustrup 写道,在控制语句的条件中声明和初始化变量不仅是允许的,而且是鼓励的。他写道,他鼓励这样做,因为它将变量的范围缩小到仅需要它们的范围。所以像这样的事情...
if ((int i = read(socket)) < 0) {
// handle error
}
else if (i > 0) {
// handle input
}
else {
return true;
}
...是良好的编程风格和实践。变量i
只存在于块if
需要它但随后超出范围的语句。
然而,g++(版本4.3.3 Ubuntu特定编译)似乎不支持编程语言的这个功能,这让我感到惊讶。也许我只是用一个标志来调用 g++ 将其关闭(我调用的标志是-g
and -Wall
)。当使用这些标志进行编译时,我的 g++ 版本返回以下编译错误:
socket.cpp:130: error: expected primary-expression before ‘int’
socket.cpp:130: error: expected `)' before ‘int’
经过进一步的研究,我发现我似乎不是唯一一个编译器不支持这一点的人。似乎有一些混乱这个问题 https://stackoverflow.com/questions/136548/pro-con-initializing-a-variable-in-a-conditional-statement-c至于到底什么语法被认为是该语言的标准以及编译器用它进行编译。
所以问题是,哪些编译器支持此功能以及需要设置哪些标志才能编译?是否存在符合某些标准而不符合其他标准的问题?
另外,出于好奇,人们是否普遍同意 Stroustrup 的观点,即这是一种很好的风格?或者这是一种语言的创建者头脑中产生的想法不一定得到该语言社区支持的情况?
允许在嵌套块的控制部分声明变量,但在以下情况下if
and while
,变量必须初始化为将被解释为条件的数字或布尔值。它cannot包含在更复杂的表达式中!
在您展示的特定情况下,不幸的是您似乎无法找到遵守的方法。
我个人认为,保持局部变量尽可能接近其在代码中的实际生命周期是一个很好的做法,即使当您从 C 切换到 C++ 或从 Pascal 切换到 C++ 时这听起来令人震惊 - 我们习惯于在以下位置查看所有变量一个地方。有了一些习惯,您会发现它更具可读性,并且您不必在其他地方寻找声明。而且,您知道在那之前它没有被使用过。
Edit:
话虽这么说,我认为在一个声明中混合太多内容并不是一个好的做法,而且我认为这是一个共同的观点。如果您影响变量的值,然后在另一个表达式中使用它,则通过将两个部分分开,代码将更具可读性并且更少混乱。
所以不要使用这个:
int i;
if((i = read(socket)) < 0) {
// handle error
}
else if(i > 0) {
// handle input
}
else {
return true;
}
我更喜欢这样:
int i = read(socket);
if(i < 0) {
// handle error
}
else if(i > 0) {
// handle input
}
else {
return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)