为什么以下代码在C ++中是非法的

时间:2015-05-20 18:53:13

标签: c++

我想创建一个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’

为什么会发生这种错误?有什么方法可以解决它?

5 个答案:

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