簡體   English   中英

帶括號的1D和2D數組初始化

[英]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.

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