簡體   English   中英

char four [4] =“四個”; 該語句的正確語義是什么?

[英]char four[4] = “four”; What are the correct semantics for this statement?

int main(void)
{
    char four[4] = "four";
    return 0;
}

當編譯為C ++程序時,G ++報告

xxx.cpp:在函數int main()中:

xxx.cpp:3:錯誤:字符數組的初始化字符串太長

當編譯一個C程序時,GCC不會報告任何錯誤。

在我看來,賦值正確地將所有4個字節都復制到了變量中,正如我所期望的那樣。

所以我的問題歸結為.....

在C中觀察到的行為是正確的還是我在某個地方碰到未定義的行為,還是完全是其他東西?

簡短的答案:您的代碼是有效的C,但不是有效的C ++。

長問:

"four"實際上是5個字符長-為您添加了\\0 C標准在第6.7.8節“ 初始化 ”的第13段中指出:

字符類型的數組可以由字符串文字初始化,並可選地用大括號括起來。 字符串文字的連續字符(如果有空間或數組大小未知,則包括終止空字符)將初始化數組的元素。

因此,當將\\0編譯為C時,它只會在您的程序中被忽略。C++對其進行了不同的處理。 實際上,這種特殊情況在C ++規范中已明確指出 (第8.5.2節“ 字符數組” ,第2段):

初始化器的數量不得超過數組元素的數量。 [ 示例:

 char cv[4] = "asdf"; // error 

格式錯誤,因為隱含的尾部'\\0'沒有空格。 結束示例 ]

字符串“ four”實際上包含五個字節:四個字母加上一個零字節(\\ 0)作為字符串終止符。 自從我寫C或C ++已經有一段時間了,但是我想C編譯器會出於任何原因默默地忽略它。

更好的是

char four[] = "four";

您所看到的是C和C ++之間的區別。 C允許您有額外的初始化程序,這些初始化程序將被忽略。 C ++禁止這樣做-如果您為字符串(或數組)指定大小,則其大小必須足夠大以容納所有初始化程序(對於字符串,包括NUL終止符),或者代碼格式錯誤(標准表示“不允許-希望編譯器拒絕它”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM