1
bool foo( int* p )
{
  return false;
}

int* bar (  )
{
  int* p;
  return p;
}

int main() {

  if ( int* p = bar() && foo( p ) )
  //if ( ((int* p = bar()) != NULL ) && (foo( p )) ) // another variant
  {

  }

  return 0;
}

error: cannot convert ‘bool’ to ‘int*’ in initialization使用 GCC 4.3.4 和 VS 2008。如果只有if ( int* p = bar())一切正常。

我知道我可以在 -statementp之前初始化if,但我对我展示的变体感兴趣。

4

7 回答 7

4
int* p = bar() && foo( p )

首先计算逻辑表达式,然后赋值

与写作相同:

int *p = ( bar() && foo(p) );
于 2012-07-17T10:20:37.787 回答
3

赋值运算符=的优先级低于布尔值,&&因此您拥有的是:

int* p = ( bar () && foo(p) )

这是尝试将 a 分配boolint*变量。

编辑:虽然在循环块中声明和初始化变量通常是一种公认​​的做法(如for(int i = 0; i < n; ++i)),但我强烈建议不要为条件语句使用这种结构,if()因为它可能会导致一些非常迷人的副作用,而你真的不会想要处理以及降低代码的可读性。

您的其他变体应该可以工作(除非我不确定您是否要将声明的结果与int*...NULL 进行比较 - 语言可能不喜欢这),但请参阅我上面关于代码清晰度的评论

于 2012-07-17T10:20:44.893 回答
2
#include <iostream>
bool foo( int* p )
{
  return false;
}

int* bar (  )
{
  int* p;
  return p;
}

int main() {
  int* p;
  if ( (p = bar()) && foo( p ) )
  //if ( ((int* p = bar()) != NULL ) && (foo( p )) ) // another variant
  {

  }

  return 0;
}

或者

int main() {

  if ( int* p = bar()){
      if ( foo( p ) ){ /*do something*/ }
  }
  return 0;
}

它运行

于 2012-07-17T10:24:07.070 回答
2

语句的条件if可以是声明表达式。声明不是表达式,因此您不能将它与另一个表达式结合起来,就像您尝试做的那样。换句话说,当你希望

(int* p = bar()) && foo(p)

这是无效的,因为int* p = bar()它不是表达式。相反,它被解读为声明

int* p = (bar() && foo(p))

这是无效的,因为初始化程序的类型错误。

在这种情况下,您将不得不在语句之前声明指针if;几个选项是:

int* p = bar(); // pollutes surrounding scope; maybe wrap in another block
if (p && foo(p)) {}

if (int* p = bar()) {
    if (foo(p)) {  // extra nesting
    }
}
于 2012-07-17T10:44:21.287 回答
2

an 的语法if需要括号中的条件。条件可以是表达式,也可以是声明(隐式转换为 的类型bool);它不能是这些的组合。如果是

if ( int* p = bar() && foo( p ) )

条件是“ ”,这是一个用;初始化int* p = bar() && foo( p )的类型的简单声明。由于is not的类型,并且不能隐式转换为 an ,因此您有一个错误。int*bar() && foo( p )bar() && foo( p )int*int*

如果你写:

if ( (int* p = bar()) != NULL )

,左括号意味着这不能是一个声明(简单或否),int* p = bar()也不是一个合法的(子)表达式。

要记住的关键点是你可以有一个声明,或者 你可以有一个表达式,但你不能将它们组合起来,C++ 不允许声明作为表达式的一部分。(另外:声明必须具有复制初始化:

if ( int* p = bar() )

,不允许直接初始化。)

于 2012-07-17T10:46:22.267 回答
0

我相信这是运算符优先级。您实际上执行:

if ( int* p = (bar() && foo( p )) )

但我相信你的意思是:

if ( (int* p = bar()) && foo( p ) )

这不完全相同。

于 2012-07-17T10:21:22.187 回答
-1

事实是,您正在进行赋值,int* p = bar()并且该语句试图比较两种类型:intand bool,这是不可能的。

您应该在 IF 语句之前分配它。

希望这可以帮助

于 2012-07-17T10:19:55.527 回答