簡體   English   中英

為什么空表達式在 C/C++ 中是合法的?

[英]Why are empty expressions legal in C/C++?

int main()
{
  int var = 0;; // Typo which compiles just fine
}

還能如何assert(foo == bar); 定義NDEBUG時編譯為NDEBUG

這就是 C 和 C++ 表達NOP 的方式

我不是語言設計師,但我給出的答案是“為什么不呢?” 從語言設計的角度來看,人們希望規則(即語法)盡可能簡單。

更不用說“空表達式”有用途,即

for (i = 0; i < INSANE_NUMBER; i++);

會死等待(不是一個很好的用途,但仍然可以使用)。

編輯:正如對此答案的評論中指出的那樣,任何物有所值的編譯器可能不會在此循環中忙於等待,並將其優化掉。 但是,如果在 for head 本身中有更有用的東西(除了 i++),我已經看到(奇怪地)用數據結構遍歷完成了,那么我想你仍然可以構造一個帶有空體的循環(通過使用/濫用“for”結構)。

你希望能夠做這樣的事情

while (fnorble(the_smurf) == FAILED)
    ;

並不是

while (fnorble(the_smurf) == FAILED)
    do_nothing_just_because_you_have_to_write_something_here();

但! 請不要在同一行寫空語句,如下所示:

while (fnorble(the_smurf) == FAILED);

這是一個很好的混淆讀者的方法,因為很容易錯過分號,因此認為下一行是循環的主體。 記住:編程實際上是關於交流——不是與編譯器,而是與其他人,他們會閱讀你的代碼。 (或者與你自己,三年后!)

好的,我會將其添加到您可能實際使用的最壞情況中:

for (int yy = 0; yy < nHeight; ++yy) {
    for (int xx = 0; xx < nWidth; ++xx) {
        for (int vv = yy - 3; vv <= yy + 3; ++vv) {
            for (int uu = xx - 3; uu <= xx + 3; ++uu) {
                if (test(uu, vv)) {
                    goto Next;
                }
            }
        }
    Next:;
    }
}   

顯然,我們可以這樣說

for (;;) {
  // stuff
}

沒有它,誰能活下去?

老實說,我不知道這是否是真正的原因,但我認為從編譯器實現者的角度考慮更有意義。

大部分編譯器是由分析特殊語法類別的自動化工具構建的。 有用的語法允許空語句似乎很自然。 當它不改變代碼的語義時,檢測這樣的“錯誤”似乎是不必要的工作。 空語句不會做任何事情,因為編譯器不會為這些語句生成代碼。

在我看來,這只是“不要修復沒有損壞的東西”的結果......

使用時; ,還請注意一件事。 還行吧:

a ? b() : c();

但是,這不會編譯:

a ? b() : ; ;

最常見的情況可能是

int i = 0;
for (/* empty */; i != 10; ++i) {
    if (x[i].bad) break;
}
if (i != 10) {
    /* panic */
}

已經有很多很好的答案,但還沒有看到生產環境樣本。

是 FreeBSD 對strlen的實現:

size_t
strlen(const char *str)
{
    const char *s;

    for (s = str; *s; ++s)
        ;
    return (s - str);
}
while (1) {
    ;  /* do nothing */
}

有時你想坐着什么都不做。 事件/中斷驅動的嵌入式應用程序或當您不希望函數退出時,例如在設置線程和等待第一次上下文切換時。

示例: http : //lxr.linux.no/linux+v2.6.29/arch/m68k/mac/misc.c#L523

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM