我在编程时遇到了这个问题并在函数调用后忘记了括号,但我只收到了警告,我忽略了这一点:
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)
那样警告我}
答案 0 :(得分:7)
您可以将clearDisplay
视为该功能的地址。最后,它将具有非零数值,并且由单个变量组成的语句在语法上是正确的。
答案 1 :(得分:5)
这与编译错误的原因相同:
for(int i = 0; i < 2; i++){
看看i++
。这是一个你完全忽略的结果。但这完全合法。为什么?因为你可以忽略表达式的结果。
为了提供帮助,当您忽略没有副作用的表达式结果时,编译器会发出警告。但是如果有一个语言规则忽略没有副作用的表达式是违法的,那就需要编译器完美地判断表达式是否有副作用,这基本上是不可能的。
答案 2 :(得分:2)
这是一个简单的解释。
与此表达式相同:
i;
只是引用变量i
而没有实际做任何事情,这个表达式:
clearDisplay;
简单地引用clearDisplay
函数而不实际调用它。