考慮char * p_c = new char ['1','2','3','4']的含義
char *p_c = new char['1', '2', '3', '4'];
這是語法正確嗎?如果是,那麼它有什麼作用?
我不知道爲什麼,但編譯器允許這種語法!關於記憶會做什麼?我無法通過*p_c
訪問變量。如何確定存在的元素的大小和數量?
考慮char * p_c = new char ['1','2','3','4']的含義
char *p_c = new char['1', '2', '3', '4'];
這是語法正確嗎?如果是,那麼它有什麼作用?
我不知道爲什麼,但編譯器允許這種語法!關於記憶會做什麼?我無法通過*p_c
訪問變量。如何確定存在的元素的大小和數量?
您的代碼在語法上是有效的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
請注意,'4'必須評估爲正數。 (這是基本執行集中的一個角色。)無論發生什麼,表達式都是合法的。 (其他字符可能是負數,所以會在運行時產生錯誤。) –
它可能會放上類似「但它幾乎肯定不會做你想要的東西」。某處靠近頂部。 –
@MartinBonner:這很有幫助。假定在使用EBCDIC編碼的系統上,'char'必須始終是'unsigned'類型。否則''4'(它有一個無符號值244)將是負數,並且因此會轉換爲一個非常大的'size_t'! – Bathsheba
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];
爲你所用的新的表達的語法是這樣的:
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'];
請仔細閱讀了有關逗號操作 - http://stackoverflow.com/questions/52550/what-does-the-comma-operator-do-in-c –
感謝您的快速回復。 – Kannan