簡體   English   中英

兩個相鄰的方括號在 C 中做什么

[英]what do two square brackets next to eachother do in C

兩個相鄰的方括號在C中做什么,它和python中的一樣嗎?

在python中它會是

lst = [1,2,3,[1,2,3]]
lst[3][1]

第二行將給出2

在 C 中它的功能相同嗎?

在 python 中,它將是 lst = [1,2,3,[1,2,3]] lst[3][1] 並且在第二個列表中將是 2。 在 C 中它的功能相同嗎?

是和否。 更像是不,是真的:

  • C 數組字面量與 Python 完全不同,它們沒有括號,而且它們是靜態類型的
  • 假設lst是一個數組數組, lst[3][1]確實會返回第四個元素的第二個元素,但是
  • C 中索引的語義與 Python 的非常不同(並且更容易出錯)
  • 事實上,C 數組的語義通常與 Python 列表的語義非常不同,假設它們的工作方式相似是完全危險的

如果您必須使用 C,那么您真的應該學習 C,而不僅僅是試圖通過半隨機等價來蒙混過關。 C 不是一門大語言,但它既不容易也不寬容。

在 C 中,您可以創建數組。 一維或多維數組...
看看c-multi-dimensional-arrays

C 不像 python 那樣支持列表。 可能被認為類似於 python 列表的類型可能是union數組。 但是它是由 C 程序員來實現的。

在 C 中,表達式E 1 [ E 2 ]等價於*( E 1 + E 2 ) 這意味着表達式E 1 + E 2必須產生一個可以取消引用的有效指針值。

習慣上, E 1將采用數組第一個元素的地址值,而E 2將是數組的索引。 在大多數表達式中,數組對象將采用其第一個元素的地址值。

C 不像 python 那樣支持列表。 可能被認為類似於 python 列表的 AC 數據結構類型可以是一個struct數組,其中struct包含一個union來表示可以存儲的各種不同類型的值。 這是必需的,因為 C 中的數組被定義為相同類型元素的連續集合。 因此,由 C 程序員來實現一種可以存儲各種類型的類型,這是通過union實現的。

只是把一些非常簡單但丑陋的東西放在一起:

#define MKLIST(...) { __VA_ARGS__, { LET_None } }
#define MKLIST_int(X) { LET_int, { .v_int = (X) } }
//...
#define MKLIST_List(X) { LET_List, { .v_list = (X) } }

enum ListElementType {
    LET_None,
    LET_int,
    //...
    LET_List,
};

struct ListElement {
    enum ListElementType type;
    union {
        int v_int;
        //...
        struct ListElement *v_list;
    } value;
};

進而,

struct ListElement sublist[] =
    MKLIST(MKLIST_int(1), MKLIST_int(2), MKLIST_int(3));
struct ListElement list[] =
    MKLIST(MKLIST_int(1), MKLIST_int(2), MKLIST_int(3),
         MKLIST_List(sublist));

雖然您可以看到您可以使用它來存儲各種值,但您無法像在 python 中那樣自然地檢索它們,因為您必須測試元素是否是您期望檢索的類型。

int
List_getint (struct ListElement *x, int i) {
    assert(x[i].type == LET_int);
    return x[i].value.v_int;
}

struct ListElement *
List_getlist (struct ListElement *x, int i) {
    assert(x[i].type == LET_List);
    return x[i].value.v_list;
}

進而,

printf("%d\n", List_getint(List_getlist(list, 3), 1));

在線試試吧!

暫無
暫無

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

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