typeof()表达式中的副作用

Phi*_*ler 8 c gcc

在GNUC C中,您可以使用typeof(expression),并且使用内部具有副作用的表达式是合法的.例如,你可以拥有这个C代码:

int x = 0;
typeof(x++) y;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,副作用被忽略,之后x仍然为零(这是有道理的,因为类型只是编译时的事情).

但是,海湾合作委员会的文件说:

当且仅当它是可变修改类型的表达式或这种类型的名称时,才评估typeof的操作数的副作用.

这句话是什么意思?是否真的可以typeof用副作用编写,并且副作用实际上是在运行时执行的?对我来说,这句话似乎表明了这一点.

Phi*_*ler 9

是的,在某些情况下,可能会在typeof评估中产生副作用.正如文档所说,它需要在"可变修改类型"内.这是一种取决于某些运行时值的类型,例如int[x].

所以下面的代码是合法的,声明y是类型的int[1],然后x的值为1:

int x = 0;
typeof(int[++x]) y;
Run Code Online (Sandbox Code Playgroud)

当然,对于一般的可变修改类型,这仅对局部变量声明(内部函数)是合法的.

  • 请注意,这与`sizeof`相同:除非出现可变长度数组且数组大小的值影响`sizeof`表达式的结果,否则不计算表达式操作数. (3认同)