[英]C variable confusion
在我的一項作業中,我看到使用了以下行:
int index = -1, k;
我不確定當有一個變量的條目時發生了什么。 當變量“ index”具有兩個條目時,到底擁有什么?
這是2個變量,無論是相同類型的定義int
: index
和k
。 只有index
用-1
初始化,而k
未被初始化。
它只是定義了兩個int
類型的變量,其中一個( index
)初始化為-1,另一個( k
)未初始化。
順便說一句,這真的很令人困惑。
正如其他幾個人所說,這是兩個變量的聲明。 它等於100%
int index = -1;
int k;
現代編碼風格會鼓勵您以這種方式編寫。 但是-那里有很多舊的C語言,在1980年代和1990年代, 對變量聲明進行分組是首選的樣式。 選擇一個隨機的塵土飛揚的甲板,我保證您會看到類似
register f, r, (*hstat)(), (*istat)(), (*qstat)();
int status;
或者可能
extern char level;
int newtry[31],newother[31],*r,*q,*p,n,sum,first;
int ii,lastwhite,lastred;
因此,您需要了解其含義。 可悲的是,他們會變得非常混亂,例如
int const* a, b;
相當於
const int *a;
int b;
這就是為什么現代編碼樣式更喜歡每個聲明使用一個變量的原因。
(為什么人們還是喜歡在一天中對聲明進行分組?我不知道。我個人認為,這可以幫助您在80x25玻璃tty上一次查看更多代碼,但是我從未真正擁有過這種經驗,所以)
在此代碼中,“ index”和“ k”都是整數類型變量,並且變量“ index”由-1分配(即index的值為-1)。 這稱為變量初始化。
假設這是函數范圍內的代碼:
int index = -1, k;
將做與
int index = -1;
int k;
或與
int index, k;
index = -1;
即使代碼與C標准不相等,世界上沒有已知的C編譯器會對這三個代碼塊進行任何不同的處理。
在C語言中,您可以一次聲明多個相同類型的變量( int index, k;
),也可以定義一個變量(同時聲明和初始化變量, int index = -1;
),或者可以在一次,聲明多個並初始化它們,或者根據您的情況僅初始化其中一個( int index = -1, k;
)。
在C中,逗號運算符,
具有比賦值操作符的優先級低 =
。 這樣,表達
int index = -1, k;
被解析為
//The parentheses are not legal in C, but it's what the parser does.
int ((index = -1), k);
您會看到,該行聲明了int
類型的變量。 第一個稱為index
且初始化為-1
,第二個稱為k
且未初始化。
您可以在此處找到有關運算符優先級的良好概述:
https://zh.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
請注意,逗號運算符是該列表中的最后一個!
同樣,您可能會看到類似或類似的C代碼:
if(condition) foo += 7, doSomething();
while(i += 2, i < 42) ...;
這相當於
if(condition) {
foo += 7;
doSomething();
}
i += 2;
while(i < 42) {
...
i += 2;
}
但是更簡潔(許多C程序員喜歡簡潔!)。 同樣,在兩種情況下,逗號運算符都將兩件事融合為一條語句,這避免了編寫完整的塊{}
並防止重復增量i += 2
。
逗號運算符的這種用法是好是壞,這取決於口味和環境。 但是您可以肯定會在野外找到它的所有可能用途。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.