在C中使用null语句

时间:2011-04-08 18:36:59

标签: c

null语句

的典型用法是什么?
;

在C?

我知道它基本上用于跳过编译器所期望的表达式,但在这里我只对这种用例的实际例子感兴趣。

12 个答案:

答案 0 :(得分:22)

这通常是预处理器剥离的代码块的副作用,例如

#if DEBUG
    #define ASSERT(_x) Assert(_x)
#else
    #define ASSERT(_x)
#endif


ASSERT(test);    // Results in null statement in non-debug builds

那个,或者在你的条件已经包含每次迭代中需要完成的任何循环中。

答案 1 :(得分:18)

while (*(dst++) = *(src++))
    ;

答案 2 :(得分:15)

在函数结尾处的标签之后(或者更确切地说,在任何块的末尾),例如

void foo(void)
{
    // ...

exit:
    ;
}

答案 3 :(得分:5)

while (somethingWithSideEffects()) ;

答案 4 :(得分:4)

我曾经在一个可能不寻常的情况下使用它(尽管很少)(并且有些/很多人会发现错误)。我不得不写一个非常复杂的if条件而没有else子句,其中if条件必须被否定。显然它可能是这样的:

if ( !( overly complex condition ) )
  {
  do stuff
  }

从积极逻辑的角度来看,有时候(至少对我来说)更有意义。换句话说,如果overly complex condition成立,我不希望代码运行。所以我把它写成:

if ( overly complex condition )
  ;  // do nothing
else
  {
  do stuff
  }  

答案 5 :(得分:2)

示例:

 while (!kbhit())
     ;

应该是不言自明的。

答案 6 :(得分:2)

我可以想到scanf验证。当用户没有提供正确的输入时,scanf会卡住。因此,为防止scanf被卡住,必须删除直到行尾的字符。

if( scanf("%d",&integer) == 0 )
{
    while( getchar() != '\n' ) ;
    // ....
}

答案 7 :(得分:2)

一种不寻常的用法-但是我真的感谢null语句的存在-是当我有两个条件和两个动作时,我发现我可以很自然地这样表达:

if(condition1)
     /* do nothing */ ;                                                      
else if(condition2)
     do_something;                                                           
else do_something_else;                                                      

通常condition1测试一切正常,但如果没有,condition2会区分两个不同的异常操作do_somethingdo_something_else

当然,这不是表达这种事情的唯一方法。可以重复condition1

if(!condition1 && condition2)
    do_something;                                                           
else if(!condition1)
    do_something_else;

但是,这似乎是次等的,因为它重复了condition1。或者可以使用嵌套的if语句:

if(!condition1) {
    if(condition2)
         do_something;                                                   
    else do_something_else;                                              
}

但是,当然,嵌套的if语句也很容易出现过度复杂和混淆。因此,我通常更喜欢使用null语句的第一个版本。

答案 8 :(得分:1)

我能想到的唯一用途是:

1-在循环结束时,操作已经在循环语句中编码。例如while(a[i--]);

2-在标签的末尾,不需要进行任何操作。例如Label: ;

答案 9 :(得分:0)

兼容编译器的单元测试。

答案 10 :(得分:0)

它更像是一个空表达式而不是一个空语句,但它经常出现在for循环中。

for (;;)                 // Loop "forever"

for (int i=10; i--; )    // 9..0

答案 11 :(得分:0)

我想知道如何将一个空表达式写入内联,并提出了这个建议。它可以编译工作。

condition ? x = 1 : "do nothing";

有趣的东西。