C99标准:逻辑非运算符能否直接作用于函数?两种写法是否等价?
C99中逻辑非运算符与函数调用的相关问题解答
1. 逻辑非运算符能否直接作用于函数?
在C99标准中,逻辑非运算符!不能直接作用于函数本身——它的操作数必须是标量类型(算术类型或指针类型)。
- 若写
!foo,这里的foo是函数指针(属于指针类型,是标量),此时!判断的是该函数指针是否为空(即是否指向有效函数地址),并非作用于函数的执行结果。 - 而
!foo()是合法写法:foo()是函数调用表达式,其结果为函数返回值(只要返回值是标量类型,比如int、char等),此时!作用于该返回值,完全符合C99的语法定义。
2. 两种写法的等价性分析
你给出的两段代码:
int output = foo(); if(!output){ }
和
if(!foo()) { }
从if条件的判断结果来看,只要foo()单次调用的返回值确定,两者逻辑完全等价:
- 两段代码都仅调用一次
foo(),!output与!foo()的计算结果完全一致。 - 唯一区别是第一段代码将
foo()的返回值保存到了变量output中,若后续代码需要复用该值,第一段写法更便捷;第二段代码未保存返回值,使用后即丢弃。
需要注意:如果foo()是带有副作用的函数(比如每次调用会修改全局变量、执行IO操作、返回值随调用次数变化等),两段代码的副作用表现完全相同(因都仅调用一次),不会因写法不同产生差异。
内容的提问来源于stack exchange,提问作者AbstractArgumentType
相关产品推荐
相关产品推荐

