[英]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 中它的功能相同嗎?
是和否。 更像是不,是真的:
lst
是一個數組數組, lst[3][1]
確實會返回第四個元素的第二個元素,但是如果您必須使用 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.