2011-12-20 39 views
4

我有這樣的代碼:正在使用數組作爲C++中有效的條件表達式嗎?

int main() 
{ 
    char buffer[10]; 
    if(buffer) { 
     return 1; 
    } 
    return 0; 
} 

的Visual C++ 10個解釋這樣的:buffer衰減到指針,則指針被針對零比較。當用/ O2編譯時,支票被取消,代碼相當於return 1;

上面的代碼是否有效? Visual C++編譯它是否正確(我的意思是衰減部分,而不是優化)?

+2

至少,elision優化對我來說似乎是完全明智的。 – 2011-12-20 12:41:16

回答

3

是的,從陣列類型到bool的轉換由標準轉換完全定義。引用C++ 11,4/1(與相關轉換高亮):

一個標準轉換序列是標準轉換在以下 順序的序列:

- 從零個或一個轉換以下集合:左值到右值的轉換,陣列到指針的轉換, 和函數到指針的轉換。

- 零或者選自以下組的一個轉換:積分促銷,浮點推廣,積分 轉換,浮點轉換,浮積分轉換,指針轉換,指針 部件轉換和布爾轉換

- 零或一個合格轉換。

如果需要將標準轉換序列轉換爲所需的目標類型 ,標準轉換序列將應用於表達式。

1

是的。

if(buffer)表示:檢查buffer是不是NULL。一個數組變量指向數組的開始(除非你移動它)並且相當於一個指針。

優化只是返回1,因爲buffer被分配在堆棧上,所以它肯定有一個值(指向堆棧上的位置的指針),所以它總是如此。

+1

一個數組不等於一個指針;它是一種單獨的類型,如果需要可轉換爲指針。 – 2011-12-20 12:54:33

7

C++ 11,6.4/4:

,其爲表達的條件的值是 表達式的值,上下文轉換爲bool比 開關其它語句;如果這種轉變是不健全的,那麼這個計劃就是不健全的。

所以標準說編譯器必須執行任何隱式轉換來將數組轉換爲布爾值。將數組衰減到指針並將指針轉換爲布爾型,並將測試的等價性設置爲null是一種方法,所以是的,程序定義良好,而且它確實產生了正確的結果 - 顯然,因爲數組是分配到棧上,它衰減的指針永遠不會等於空指針。

更新:至於爲什麼鏈中的兩個轉換之後:

C++ 11,4.2/1:

左值或類型的右值「NT的陣列「或」T的未知範圍數組 「可以被轉換爲類型」指向T的指針「的前值。結果 是指向數組的第一個元素的指針。

因此,從數組類型的唯一合法轉換是指向元素類型的指針。第一步沒有選擇。

C++ 11,4.12/1:

算術,無作用域枚舉的一個prvalue,指針,或指針 到成員類型可以轉換爲bool類型的prvalue。零值 值,空指針值或空成員指針值被轉換爲 爲false;任何其他值轉換爲truestd::nullptr_t類型的值可以轉換爲bool類型的預值; 結果值爲false

存在直接從裸指針到布爾值的隱式轉換;因此編譯器將其選爲第二步,因爲它允許立即到達所需的結果(轉換爲布爾值)。

+0

好的,它是*這樣做的一種方式*,但爲什麼正是這種方式? – sharptooth 2011-12-20 12:45:38

+0

@sharptooth:編輯和改進,現在有更多的標準。 – Jon 2011-12-20 12:52:28

0

你自己說的:

緩衝衰減到指針

由於數組是在棧上,它不能爲空(除非出了問題,像棧溢出)。