C语言if语句使用函数名作为判断条件的异常行为咨询
问题原理
代码中if (function_returning_false)的写法没有添加函数调用所需的括号(),因此此处判断的不是函数的返回值,而是函数本身的内存地址。
根据C语言语法规则:
- 单独使用函数名时,函数名会隐式转换为指向该函数的指针
- 合法定义的函数内存地址永远不会为0(NULL),因此在布尔判断中会永远被判定为真
- 整个判断逻辑完全没有执行对应的函数,因此无论你怎么修改函数内部的返回值,都不会影响判断结果,这就是你所有修改返回值的测试都无效的原因。
修正方案
只需要在函数名后添加调用括号,即可判断函数实际返回值:
if (function_returning_false()) { printf("function returned true\n"); }
补充说明
这类问题属于合法但不符合预期的语法,默认编译不会报错。如果编译时开启高警告等级(例如gcc -Wall),编译器会输出「指针永远为真」类的警告,可以提前发现这类低级错误。
内容的提问来源于stack exchange,提问作者Auri
相关产品推荐
相关产品推荐

