[英]1D and 2D array initialization with braces
以下代碼給出“無效的初始化程序”錯誤:
int a[]=(1,2,3);
但是,盡管以下代碼將“,”視為逗號OPERATOR而不是SEPARATOR,但編譯成功:
int a[][2]={(1,2),(3,4)};
那么,為什么()
對於1D數組無效而對於2D數組無效?
在第一個示例中:
int a[]=(1,2,3);
初始值設定項是int
類型的(相當奇怪的)表達式。 (它包含兩個逗號運算符,並產生值3
)對象是一個數組。 初始化無效,因為它是類型不匹配。
第二:
int a[][2]={(1,2),(3,4)};
等效於:
int a[][2] = { 2, 4 };
這是有效的,因為可以省略初始化程序中的嵌套花括號; 元素用於初始化對象的連續元素。 第一個和第三個逗號是逗號運算符; 第二個是定界符。
如果初始化程序只是目標類型的表達式,無論是標量,結構還是聯合,最外面的花括號都是可選的 。 例如,您可以編寫:
int x = 42;
int y = { 42 };
指定元素值的初始化程序(用於數組,結構或聯合對象) 需要最外面的花括號。
例如:
struct foo {
int x;
int y;
};
struct foo arr[2] = { 1, 2, 3, 4 };
是有效的-但更清楚地寫為:
struct foo arr[2] = { { 1, 2 }, { 3, 4 } };
除了第一個示例無效之外,兩者都是較差的樣式。 第一個可能旨在:
int a[] = { 1, 2, 3 };
第二個是:
int a[][2] = { 2, 4 };
要么
int a[][2] = {{1, 2}, {3, 4}};
根據意圖。
您在第一個示例中忘記了花括號。 稱贊(大括號)表示數組內容的初始化,然后由您在這些稱贊中的聲明處理內容。 基本上,您沒有在第一個示例中初始化數組。 括號表示評估的順序,而不是參數對函數的處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.