我想创建一个if
,其中声明,分配和检查变量。如果变量的值是可接受的,我想在if
体内使用它。以下是我认为我能做到的一个例子:
if ((int result = Foo()) != 0) {
// use result
}
我假设Foo()
返回一些值,该值已分配给result
,并由赋值运算符=
返回,最后在0
中针对!= 0
进行检查}。不幸的是,它会导致编译错误:
main.cpp:31:10: error: expected primary-expression before ‘int’
if ((int i = Foo()) != 0)
^
main.cpp:31:10: error: expected ‘)’ before ‘int’
为什么会发生这种错误?有什么方法可以解决它?
答案 0 :(得分:7)
支持逻辑,但在if
语句中声明变量并以这种方式使用它不是。原因与初始化程序的工作方式与常规赋值不同,但解决这个问题很容易,也很简单。
只需做这样的事情。
int result;
if ((result = Foo()) != 0) {
// use result
}
答案 1 :(得分:3)
您的推理似乎是基于{/ 1}}
中的假设=
是一个赋值运算符,if ((int result = Foo()) != 0)
是"只是一个表达式"评估的东西。
事实并非如此。
int result = Foo()
部分不是C ++中的表达式。这是一个带初始化程序的声明。初始化语法中的int result = Foo()
根本不是赋值运算符。它只是一个句法元素巧合地使用相同的字符作为赋值运算符。 =
不是表达式,它不会评估"任何结果。
因为如果以上,支持
之类的东西int result = Foo()
需要特殊处理,这严重限制了此语法的灵活性。您在代码中尝试的内容超出了特殊处理所允许的范围。
答案 2 :(得分:2)
Bjarne将此构造用作6.3.2.1 C ++编程语言中的范围限制器作为推荐。
使用:
if (int result = Foo()) {
// use non-zero result
}
对指针
特别有用if (Foo* result = GetFoo()) {
// use valid Foo
}
!=0
部分是多余的,因为真实性为!=0
。
不允许使用扩展构造进行比较。
从here
进一步讨论这个结构答案 3 :(得分:0)
失败是因为它是非法的。这也很难看。 @Jonathan Wood建议在if
之外声明变量。我建议在外面拨打Foo
:
int result = Foo();
if(result!=0) ...
(x=f())!=y
构造虽然合法为if
条件,但只在循环中有意义,其中
`而((C =的getchar())!='\ n)的 ......用c做点什么......
是
的更短和更好的等价物c = getchar();
while(c!='\n')
{
...
c = getchar(c);
}
它保存了两次写入getchar()的调用。在if
中使用时,它不会保存任何内容,因此使用它没有意义。
答案 4 :(得分:0)
试试这个:
if ( int i = (Foo() != 0) ? Foo() : 0 ){
cout << "Hello. Number i = " << i;
}