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 ) )
,左括号中的意思是