的代碼示例是明顯無效C.正如其他人已經指出,C沒有then
關鍵字。這可能只是你的老師的一個錯誤,並不是爲了特別說明任何事情。我將展示類似的例子來說明這一點。
該代碼是正確的:
char *p;
/* code that assigns a value to p omitted */
if (p && *p)
foo();
任何標量值可被用作一個條件;如果它等於零,則將其視爲false,否則視爲true。 (在原始樣品,p
是未初始化,導致未定義的行爲,如果使用它的值,但我會承擔任何初始化代碼簡單地省略)
以上可以更明確地寫成:
char *p;
/* code that assigns a value to p omitted */
if (p != NULL && *p != '\0')
foo();
如果p
是空指針,則評估*p
將會失效(導致未定義的行爲)。通過測試p
在嘗試解引用之前是否爲空,上述代碼避免了任何此類錯誤,因爲&&
具有短路行爲。該if
聲明也可以寫爲:
if (p != NULL) {
if (*p != '\0') {
foo();
}
}
該代碼調用函數foo
如果p
是一個非空指針指向一個非空字符。 (這些是「null」這個詞的兩個不同含義。)如果p
意味着指向字符串的指針,那麼p != '\0'
意味着它指向的字符串不是空的。
現在第二示例:
char *p;
/* code that assigns a value to p omitted */
if (*p && p)
foo();
,或者更明確地:
char *p;
/* code that assigns a value to p omitted */
if (*p != '\0' && p != NULL)
foo();
這會導致不確定的行爲(可能是一個程序崩潰)如果p
是空指針。在程序已經崩潰後,檢查p != NULL
執行得太晚。
C中沒有'then'關鍵字,你能發佈實際的代碼嗎? – ouah 2014-10-01 17:55:19
「給出錯誤」是什麼意思?編譯器消息?碰撞?不按預期工作? (你期望什麼?)什麼是「調用正則表達式」?而僞代碼對於像這樣的問題並不是真的有用...... – mafso 2014-10-01 17:55:57
好吧,它不是'不','可能不是'是推動者。 「p」不可能被初始化爲「NULL」,所以在第一個例子中,解引用幾乎不會發生。 – HuStmpHrrr 2014-10-01 18:06:08