声明为条件 - 添加括号会导致错误

时间:2010-12-13 09:09:03

标签: c++ conditional variable-assignment

为什么这样可以:

if(int i = 1) {
}

...而以下产生错误?

if((int i = 1)) {
}

在g ++(4.4.5)下,后者给出:

  

test.cpp:7:错误:在'int'之前预期的primary-expression
  test.cpp:7:错误:预期')'在'int'之前   test.cpp:9:错误:预期')'在'else'之前   test.cpp:13:错误:在'}'标记之前预期的primary-expression
  test.cpp:13:错误:预期';'在'}'标记

之前

顺便说一句,我问的原因是因为这个答案:Seeing what class an object is

我正试图找到一种方法来使条件更具可读性。通常,我更喜欢,例如:

if((x = y) != 0) {

if(x = y) {

...因为它更具可读性并且使编译器“评论”沉默,这表明我可能使用了错误的运算符。如果我使用声明作为条件,它不会产生警告,但可读性似乎仍然受到影响。

2 个答案:

答案 0 :(得分:4)

这是因为C ++标准,6.4 p1。

  

选择语句选择几个控制流之一。

选择语句:

if ( condition ) statement
if ( condition ) statement else statement
switch ( condition ) statement

条件:

expression
type-specifier-seq declarator = assignment-expression

答案 1 :(得分:3)

这不是作业。这是一个宣言。您可以将声明放在其他地方作为条件,如下面的

if(int i = value) ...;
for(...; int i = value; ...) ...;
switch(int i = value) ...;
while(int i = value) ...;

这是一种很少使用的形式,但它不是那里指定的表达式。你在那里做了什么声明一个变量i你可以在身体中使用

// fire if get() returns non-null
if(weapon *w = get()) {
  w->fire();
}

围绕这样的声明不允许使用括号。我认为这没有任何意义。