簡體   English   中英

C變量混亂

[英]C variable confusion

在我的一項作業中,我看到使用了以下行:

int index = -1, k;

我不確定當有一個變量的條目時發生了什么。 當變量“ index”具有兩個條目時,到底擁有什么?

這是2個變量,無論是相同類型的定義intindexk 只有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.

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