繁体   English   中英

c / c ++使用else代替if

[英]c/c++ using else instead of if not

遇到了一些看起来很奇怪的代码,这让我想知道它是否有任何实际应用,还是只是一个随机的怪癖。

该代码基本上如下所示:

#ifdef PREPROCESSOR_CONDITION
    if (runtime_condition) {
    } else
#endif
    {
        //expression
    }

我包括了宏位,尽管我怀疑它是否有影响。 当runtime_condition为true时,没有任何代码可以运行,只有else块。 我认为这应该与使用if(!runtime_condition)完全相同,并且不使用else块(本来会更简单),但是也许正在发生某种编译器优化的事情?

或者,您知道,可能是if块中曾经有一些东西被删除,没有人愿意更改表达式。

保证条件肯定总是有两个分支(就当它被编译为条件的场合)保证的人谁总是有一个平台上工作PREPROCESSOR_CONDITION定义不会心不在焉地添加一个真正else下面的框,其中明确ISN”该块应该如何工作(或更糟糕的是,“修复”它,以使它们的代码可以在任何地方编译,但是在此过程中,无论原始作者以何种方式构造其块,都将对其造成损害)。

如果是这样的话,通常可以通过将if-empty-else的确切细节隐藏在名为UNLESS类的宏后面来进行显式通信。


绝对与优化无关。 如果您考虑所涉及的跳转,则编译器已经必须将谓词的值取反,以决定是否跳过该块(即if (A) {B;} C:...的确意味着if (!A) goto C; B; C:... ),这意味着它会折叠手写的! 无论如何,在表达式最外层的条件结构中; 由于大多数指令集都会提供“ 如果真”和“ 如果不是真”指令,则这样做是完全免费的,并且两种在源代码中写入“如果不是”的方法甚至会在非常小的情况下产生相同的机器代码。简单的编译器,无需任何优化。

“宏位”很重要。

考虑如果程序员错误地将代码段更改为

#ifdef PREPROCESSOR_CONDITION
if (runtime_condition)
{
}
else
#endif
{
    //expression
}
else
{
    // another expression
}

无论是否定义了PREPROCESSOR_CONDITION ,都将导致编译错误。

随着您的更改,即;

#ifdef PREPROCESSOR_CONDITION
if (!runtime_condition)
#endif
{
    //expression
}
else
{
    // another expression
}

如果定义了PREPROCESSOR_CONDITION ,它将编译,但是如果没有定义,它将失败。

如果添加else的程序员仅在定义了PREPROCESSOR_CONDITION条件下尝试编译,则不会发现问题。 这样,代码中将存在潜在的缺陷,直到使用未定义的PREPROCESSOR_CONDITION编译代码后, PREPROCESSOR_CONDITION才会暴露出来。

在单个代码段中,这似乎很小,但是如果在较大的项目中发生意外编译错误(例如,代码在意外地方中断),则将是一个很大的生产率问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM