2016-12-23 33 views
4

考慮char * p_c = new char ['1','2','3','4']的含義

char *p_c = new char['1', '2', '3', '4'];

這是語法正確嗎?如果是,那麼它有什麼作用?

我不知道爲什麼,但編譯器允許這種語法!關於記憶會做什麼?我無法通過*p_c訪問變量。如何確定存在的元素的大小和數量?

+0

請仔細閱讀了有關逗號操作 - http://stackoverflow.com/questions/52550/what-does-the-comma-operator-do-in-c –

+0

感謝您的快速回復。 – Kannan

回答

16

您的代碼在語法上是有效的C++,如果比較奇怪,我不認爲它做什麼,你打算:

new char['1', '2', '3', '4']被評價爲new char['4']由於方式逗號運營商的作品。 (前面的元件被從左至右評價,但表達的值是最右邊的元件的。)

所以你的語句相當於char *p_c = new char['4'];

'4'char類型與一個數值,取決於您的平臺使用的編碼(ASCII,EBCDIC & c。儘管前者很可能在桌面系統上)。

因此,數組中元素的數量是'4'在轉換爲size_t時計算的值。在ASCII系統元件的數量將是52

+1

請注意,'4'必須評估爲正數。 (這是基本執行集中的一個角色。)無論發生什麼,表達式都是合法的。 (其他字符可能是負數,所以會在運行時產生錯誤。) –

+1

它可能會放上類似「但它幾乎肯定不會做你想要的東西」。某處靠近頂部。 –

+0

@MartinBonner:這很有幫助。假定在使用EBCDIC編碼的系統上,'char'必須始終是'unsigned'類型。否則''4'(它有一個無符號值244)將是負數,並且因此會轉換爲一個非常大的'size_t'! – Bathsheba

2
char *p_c = new char['1', '2', '3', '4']; 

在功能上等同於:由於

char *p_c = new char['4']; 

comma operator。逗號運算符從左到右評估其操作符並丟棄除最後一個(最右邊一個)之外的操作符。

字符文字'4'在ASCII碼值52(但您的系統沒有使用ASCII也不需要它通過C或C++ standards--但幾乎所有的現代系統都使用ASCII)。

所以,這是因爲如果你使用:

char *p_c = new char[52]; 
5

爲你所用的新的表達的語法是這樣的:

identifier = new Type[<expression>]; 

在上面的<expression>,C++允許任何表達式的結果可轉換爲std::size_t。而對於你自己的表達,你使用了逗號運算符。

<expression> := '1', '2', '3', '4' 

將在逗號列表中的每一項評估,並返回最後,這是'4',那結果將被轉換成其std::size_t值,大概(52);所以,代碼等同於:

char* p_c = new char['4'];