C++ 为什么';“这是什么?”;如果-报表工作?

C++ 为什么';“这是什么?”;如果-报表工作?,c++,pointers,if-statement,C++,Pointers,If Statement,我发现错误:无法使用GCC 4.3.4和VS 2008在初始化时将'bool'转换为'int*'。如果只有If(int*p=bar())一切正常 我知道我可以在if-语句之前初始化p,但我对我显示的变量感兴趣。事实上,您正在使用int*p=bar()进行赋值,并且该语句尝试比较两种类型:int和bool,这是不可能的 您应该在IF语句之前分配它 希望这对您有所帮助。事实上,您正在使用int*p=bar()进行赋值,并且该语句尝试比较两种类型:int和bool,这是不可能的 bool foo( i

我发现
错误:无法使用GCC 4.3.4和VS 2008在初始化时将'bool'转换为'int*'。如果只有
If(int*p=bar())
一切正常


我知道我可以在
if
-语句之前初始化
p
,但我对我显示的变量感兴趣。

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

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


希望这对您有所帮助。事实上,您正在使用
int*p=bar()
进行赋值,并且该语句尝试比较两种类型:
int
bool
,这是不可能的

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;
}
您应该在IF语句之前分配它

希望这有帮助

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;
}
首先计算逻辑表达式,然后赋值

与写作相同:

int* p = bar() && foo( p )
首先计算逻辑表达式,然后赋值

与写作相同:

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

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

int *p = ( bar() && foo(p) );
它试图将
bool
分配给
int*
变量

Edit:虽然在循环块中声明和初始化变量通常是一种公认的做法(比如
for(inti=0;i
),但我强烈建议不要对条件语句使用这种构造,比如
if()
因为它可能会导致一些非常迷人的副作用,而这些副作用是您确实不想处理的,并且会降低代码的可读性


您的另一个变体应该可以工作(除了我不确定您是否希望将声明
int*…
的结果与空值进行比较-该语言可能不喜欢空值),但是,请参见我上面关于代码清晰性的评论

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

int *p = ( bar() && foo(p) );
它试图将
bool
分配给
int*
变量

Edit:虽然在循环块中声明和初始化变量通常是一种公认的做法(比如
for(inti=0;i
),但我强烈建议不要对条件语句使用这种构造,比如
if()
因为它可能会导致一些非常迷人的副作用,而这些副作用是您确实不想处理的,并且会降低代码的可读性


您的另一个变体应该可以工作(除了我不确定您是否希望将声明的结果
int*…
与NULL进行比较-这可能不是语言所喜欢的),但是请参阅我上面关于代码清晰性的评论,我相信这是运算符的优先级。你实际上执行:

int* p = ( bar () && foo(p) )
但我相信你要执行的是:

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

这不完全相同。

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

int* p = ( bar () && foo(p) )
if ( (int* p = bar()) && foo( p ) )
但我相信你要执行的是:

if ( int* p = (bar() && foo( p )) )
这并不完全相同

if ( (int* p = bar()) && foo( p ) )
它运行


它运行
if
语句的条件,该条件可以是声明或表达式。声明不是表达式,因此您无法在尝试执行时将其与另一个表达式组合。换句话说,当你希望

int main() {

  if ( int* p = bar()){
      if ( foo( p ) ){ /*do something*/ }
  }
  return 0;
}
这是无效的,因为
int*p=bar()
不是表达式。相反,它被解读为宣言

(int* p = bar()) && foo(p)
这是无效的,因为初始化器的类型错误

在这种情况下,必须在
if
语句之前声明指针;有两种选择:

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

if
语句的条件可以是声明或表达式。声明不是表达式,因此您无法在尝试执行时将其与另一个表达式组合。换句话说,当你希望

int main() {

  if ( int* p = bar()){
      if ( foo( p ) ){ /*do something*/ }
  }
  return 0;
}
这是无效的,因为
int*p=bar()
不是表达式。相反,它被解读为宣言

(int* p = bar()) && foo(p)
这是无效的,因为初始化器的类型错误

在这种情况下,必须在
if
语句之前声明指针;有两种选择:

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

if
的语法需要括号中的条件。A. 条件可以是表达式,也可以是(条件的)声明 输入时隐式转换为
bool
);它不可能是一个组合 其中之一。就

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

if (int* p = bar()) {
    if (foo(p)) {  // extra nesting
    }
}
,条件是“
int*p=bar()&&foo(p)
”,这是一个简单的 用
bar()和&foo(p)
初始化的类型
int*
的声明;自从
bar()&&foo(p)
的类型不是
int*
,不能隐式 转换为
int*
,您有一个错误

如果你写:

if ( int* p = bar() && foo( p ) )
,左括号表示这不能是一个声明(简单 或否),并且
int*p=bar()
不是合法的(子)表达式

需要记住的关键点是,您可以有一个声明,或者 你可以有一个表达式,但是你不能把它们和C++结合起来 不允许将声明作为表达式的一部分。(还包括: 声明必须具有副本初始化:

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

,不允许直接初始化。)

如果
需要括号中的条件,则
的语法。A.
条件可以是表达式,也可以是(条件的)声明
输入时隐式转换为
bool
);它不可能是一个组合 其中之一。就

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

if (int* p = bar()) {
    if (foo(p)) {  // extra nesting
    }
}
,条件是“
int*p=bar()&&foo(p)
”,这是一个简单的 用
bar()和&foo(p)
初始化的类型
int*
的声明;自从
bar()&&foo(p)
的类型不是
int*
,不能隐式 转换为
int*
,您有一个错误

如果你写:

if ( int* p = bar() && foo( p ) )
,左括号中的意思是