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
- 声明,但我对我所展示的变体感兴趣。
答案 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()
进行作业,并且该语句会尝试比较两种类型:int
和bool
,这是不可能的。
您应该在IF语句之前分配它。
希望这有帮助