6

今天,我發現,你可以用C編寫這樣的代碼++和編譯:這個動態分配是做什麼的?

int* ptr = new int(5, 6); 

這樣做有什麼目的?我當然知道動態new int(5)的事情,但在這裏我迷路了。任何線索?

+4

對於它的價值,在這種情況下做到這一點的正確方法是'int * ptr = new int((5,6));'。 'int(5,6)'應該導致一個錯誤,但是把它放在括號裏會變成6,然後使用它。這就是說,這很醜陋。 :) – GManNickG 2010-02-26 23:45:05

+0

@GMan:你應該把這個作爲答案,以便我們可以放棄它。 – Zacky112 2010-02-26 23:47:11

回答

13

您正在使用逗號運算符,它只計算一個值(最右邊)。

逗號(,)分開用於 分離兩個或更多個表達式 被包括其中僅一個表達 預期。當必須針對 值評估一組 表達式時,僅考慮最右邊的表達式 。

Source

,該指針指向與上述6值進行初始化的存儲器地址。

+0

由於運算符(,)放棄了它的第一個操作數,它與new int(6)相同。對? – Stringer 2010-02-26 23:47:39

+3

是的,這是正確的。但你可以有一些其他的表達,而不是5,你會想要評估和6返回。它將評估所有表達式,但返回最後一個表達式。 – 2010-02-26 23:48:17

+1

http://msdn.microsoft.com/en-us/library/zs06xbxh(VS.80).aspx但是在那個鏈接上微軟說:「逗號通常用作分隔符(例如在實際的函數參數或集合初始值設定項),逗號運算符及其操作數必須括在括號內。「 int(expression)中的表達式不會作爲參數列表進行計數,因此不會將逗號作爲分隔符進行計算嗎? – Bob 2010-02-26 23:49:27

1

我的編譯器g ++在嘗試這樣做時返回一個錯誤。

你看到了什麼編譯器或代碼?

+0

Visual Studio 2008.我寫了那個代碼。 – Stringer 2010-02-26 23:45:57

+0

它在MSVC 6.0中編譯並使用值6初始化位置ptr。 – 2010-02-27 05:10:03

1

我相信這是意味着分配某種二維數組的錯誤。但是你不能在C++中做到這一點。代碼片段實際上是編譯的,因爲它使用了逗號運算符,它返回最後一個表達式並忽略所有其他表達式的結果。這意味着該聲明等同於:

int* ptr = new int(6); 
1

5被忽略。這會在堆上分配一個int並將其初始化爲(5,6)。

一組由逗號運算符分隔語句的結果是最後一條語句的值,因此INT被初始化爲6

1

只要做到這一點:

int* ptr = new int(6); 

至於逗號操作員而言,如果沒有它就無法完成所需的任務,請使用它。沒有應用技巧的用處,例如:

int* ptr = new int(5, 6);