为什么这个“if”-statement不起作用?

时间:2012-07-17 10:17:52

标签: c++ pointers if-statement

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;
}

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

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

7 个答案:

答案 0 :(得分:4)

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

首先评估逻辑表达式,然后分配

与写作相同:

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

答案 1 :(得分:3)

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

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

尝试将bool分配给int*变量。

编辑:虽然在循环块中声明和初始化变量通常是公认的惯例(如for(int i = 0; i < n; ++i)),但我强烈反对这种条件语句的构造,比如{{ 1}}因为它可能导致一些非常迷人的副作用,你真的不想处理它们以及降低你的代码的可读性。

您的其他变体应该有效(除非我不确定您要将声明if()的结果与NULL进行比较 - 可能不被语言所喜欢),但请参阅上面关于代码清晰度

答案 2 :(得分: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;
}

OR

int main() {

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

它运行

答案 3 :(得分: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
    }
}

答案 4 :(得分:2)

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

的情况下
if ( int* p = bar() && foo( p ) )

条件是“int* p = bar() && foo( p )”,这很简单 使用int*初始化的bar() && foo( p )类型的声明;以来 bar() && foo( p )的类型不是int*,也不能隐含 转换为int*,您有错误。

如果你写:

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

,开头的括号表示这不是一个声明(简单 或者没有),int* p = bar()不是合法(子)表达。

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

if ( int* p = bar() )

,不允许直接初始化。)

答案 5 :(得分:0)

我相信这是运营商的优先权。你实际上执行:

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

但是你的意思是执行,我相信是:

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

这不完全相同。

答案 6 :(得分:-1)

事实是,您正在使用int* p = bar()进行作业,并且该语句会尝试比较两种类型:intbool,这是不可能的。

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

希望这有帮助