null语句
的典型用法是什么?;
在C?
我知道它基本上用于跳过编译器所期望的表达式,但在这里我只对这种用例的实际例子感兴趣。
答案 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_something
和do_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";
有趣的东西。