2017-10-18 82 views
1

是否有一個特殊的名字在做條件分配?下面是一個例子就是我用C問:你在有條件的情況下稱做什麼工作?

// Assume a and b have been previously defined and are compatible types 
if((a = b)) { // <- What do you call that? 
    //do something 
} 

我的一對夫婦朋友,我相信,有它的名稱,以及其他一些人都認爲只有一個,但我們無法在任何地方找到它。有沒有人聽說過這個詞?

+7

如果我看到這樣的代碼,我傾向於稱之爲「錯誤」。它通常被認爲是'a == b'。但它也可能是故意的。 – Yunnosch

+1

@Yunnosch哈哈,你打敗了我。如果是故意的,最好用'如果((a = b))'''中的雙parens來表示。 GCC和Clang都有一個'-Wparentheses'選項,可以警告你,如果你在一個條件內進行賦值而沒有雙引號。 –

+0

在Swift中被稱爲「可選展開」。 ;) –

回答

1

假設的分配是故意的,也沒有特別的名字這一點。 C語言規範對一個if語句的控制表達非常弱的要求:

6.8.4.1-1:的控制表達式if語句應具有標量類型。

賦值表達式滿足此要求,只要ab是標量。如果表達式相比較不等於0。在其他形式在兩種形式中,在執行第一子語句,:

6.8.4.1-2:零隱式比較是在該分配的結果,執行如果表達式比較等於0

注意,當他們看到這樣的一個任務是編譯器會發出警告,執行第二子語句,因爲缺少第二=是錯誤的常見原因。 You can prevent these warnings using parentheses, as described in this Q&A

1

儘管人們稱之爲各種各樣的東西,但它並沒有真正的名字。如果代碼如下你的問題:

if(a = b)... 

然後共同條件是:錯誤誤差,等等。然而,如果b不是可變的,但一種表達,例如如常見的C模式:

if((c = getchar()) != EOF)... 
while(*q++ = *p++)... 

那麼它可能被稱爲成語模式

+0

如果(a = b)是一個合法的構造,儘管通常它被寫爲一個錯誤 –

+0

@JooseppiLuna - 確切地說,它是有效的代碼,但可能很少有人意圖,因此人們經常稱它爲什麼* bug *,*錯誤*,或*錯誤* ... – CRD

0

我不知道它是否有名字,但我會稱之爲「沒有人理解的有用功能」。 確實非常有用。 我們可以認爲它是一種俚語。

在C++中,例如可以通過直接聲明變量使用此,並且該方法適用於安全檢查:

如果(對象* A = takeObject()){ //一個不nullptr }

或當我不想重複聲明一個循環:

while (a = next()) { 

} 

相反的:

a = next(); 
while (a) { 

    a = next(); 
} 

但通常這些只是像gcc和clang這樣的編譯器給出警告的錯誤(並且他們強迫你使用一個可怕的雙元組來沉默警告!)。

相關問題