没有括号的C ++函数调用

时间:2015-07-08 16:22:41

标签: c++

我在编程时遇到了这个问题并在函数调用后忘记了括号,但我只收到了警告,我忽略了这一点:

main.cpp:7:15: warning: expression result unused [-Wunused-value]
                if (i == 0) clearDisplay;
                            ^~~~~~~~~~~~

只做

时会发生同样的事情
int i = 0;
i;

为什么这不是编译错误?

#include <iostream>

void clearDisplay(void);

int main(void){
    for(int i = 0; i < 2; i++){
        if (i == 0) clearDisplay;
    }
}

void clearDisplay(void){
    std::cout << "test" << std::endl;
}

编辑: 与g++ "Calling" function without parenthesis ( not f() but f; ). Why always returns 1?相反,我不会问为什么它会隐含地转换为数字,但为什么编译器不会像if(i=0) if(i==0)那样警告我}

3 个答案:

答案 0 :(得分:7)

您可以将clearDisplay视为该功能的地址。最后,它将具有非零数值,并且由单个变量组成的语句在语法上是正确的。

答案 1 :(得分:5)

这与编译错误的原因相同:

for(int i = 0; i < 2; i++){

看看i++。这是一个你完全忽略的结果。但这完全合法。为什么?因为你可以忽略表达式的结果。

为了提供帮助,当您忽略没有副作用的表达式结果时,编译器会发出警告。但是如果有一个语言规则忽略没有副作用的表达式是违法的,那就需要编译器完美地判断表达式是否有副作用,这基本上是不可能的。

答案 2 :(得分:2)

这是一个简单的解释。

与此表达式相同:

i;

只是引用变量i而没有实际做任何事情,这个表达式:

clearDisplay;

简单地引用clearDisplay函数而不实际调用它。