c-编译if语句中的时间条件



如果我有一个if语句,其中的条件可以在编译时求值,那么如果条件求值为false,编译器会删除整个if吗,如下所示:

if (1 < 0) { puts("hello"); } 

或者如果if条件评估为真,则仅取消检查:

if (0 < 1) { puts("hello"); }
/* just becomes */ 
puts("hello"); 

我见过的几乎每一个编译器都会评估操作数为整数常量表达式的算术和比较运算符,从而产生整数常量表达式,并会基于常量零或常量非零条件优化条件分支。在许多编译器上,这可以通过以下结构来促进编译时断言:

if (WOOZLE >= 23)
{
extern void woozle_isnt_a_constant_less_than_23(void);
woozle_isnt_a_constant_less_than_23();
}

在该构造可用作静态断言的编译器上,如果WOOZLE是小于23的编译时整数常数,则函数调用和对标识符woozle_isnt_a_constant_less_than_23的所有引用都将被优化,因此链接器将没有理由关心该函数是否存在。然而,我使用过的其他一些编译器会包含对该函数的引用,无论是否调用它,如果它不存在,就会导致链接错误。

编译器可以执行任何优化,只要生成的程序的可观察行为与C抽象机的行为相匹配。

换句话说:是的,如果condition可以在编译时确定为始终分别评估为0或非0,则标准允许,但不要求if (condition) { block; }{}{ block; }替换。

最新更新