2014-01-11 431 views
1

這是一個非常簡單的問題,但是我想在繼續前進之前想知道這個問題,這樣我就能理解這個過程。{}在C中做些什麼

在教程中,我跟着我使用了一個if語句。如果您執行以下代碼,則不需要使用{}

if (userValue == "1") 
    message = "You won a new car!"; 

但是,如果您使用多行代碼,則需要{}。

if (userValue == "1") 
{ 
    WriteLine ("You won a new car!"); 
    ReadLine(); 
} 

有人能以非常簡單的方式向我解釋爲什麼會出現這種情況嗎?我只需要一個經驗法則,我可以理解爲什麼。沒有太複雜的我只是一個初學者。我明白他們確定了一段代碼,但我不確定爲什麼這會在一兩行之間產生差異?

+0

即使對單行使用大括號也可防止意外錯誤的邏輯。這個問題已經被問過很多次了...... http://stackoverflow.com/questions/12193170/whats-the-purpose-of-using-for-a-single-line Muppet upvote ahoy! –

+1

http://msdn.microsoft.com/en-us/library/fh88ctk1.aspx – OldProgrammer

+0

@OldProgrammer - 儘管被鏈接到C規範,但它很好,因爲C/C++/Java/JavaScript/C#對於'如果-statement'。 –

回答

3

{}指示一段代碼。如果您有多個要執行的陳述,如果如果爲真,那麼您需要使用這些陳述。

實施例: 沒有{}塊:

if (userValue == "1") 
    WriteLine ("You won a new car!"); 
    ReadLine(); 

將執行的ReadLine()命令是否userValue等於1

對比度與所述一個帶花括號:

if (userValue == "1") 
{ 
    WriteLine ("You won a new car!"); 
    ReadLine(); 
} 

在現在情況下,userValue不等於1,這兩個命令內的大括號被跳過,執行與第繼續e}後的下一個陳述。

1

{}定義表達式的範圍。在c#和其他幾種語言中,他們可以簡化表達式,就像第一個例子。

1

{}定義執行範圍基於C的語言,如C++,C#,Java。如果將{}添加到if語句中,則可以定義在該條件內將要執行的內容。

//1.both lines are surrounded by { } 
if (userValue == "1") 
{ 
    //executes both lines when value is 1 
    WriteLine ("You won a new car!"); 
    ReadLine(); 
} 

//2.No { } after the if statement 
if (userValue == "1") 
    //executes only this one when value is 1 - it's scope is implied (see point 3.below) 
    WriteLine ("You won a new car!"); 
//this one always will get executed, as it is not in scope of the if statement 
ReadLine(); 

//3 - no {} means implied scope for one liner 
if (userValue == "1") 
    message = "You won a new car!"; 

//and is equivalent to 
if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 
7

這些被稱爲blocks

塊允許在允許單個語句的上下文中寫入多個語句。

它們用於將一個或多個語句組合在一起。在像if語句這樣的控制結構中,它們用於使塊內的所有語句有條件,而不是緊跟在if語句之後的語句。

塊也有它們自己的scope,這意味着塊內定義的變量不能在塊外被引用,並且單獨塊中的兩個變量是不同的,即使它們具有相同的名稱。

大多數編程語言都具有某種類型的塊,而C#使用花括號來劃分它們的事實將它放置在一系列語法相關的語言中,稱爲curly-brace languages,以及C,C++,Java等等。

5

在你的例子中{}指定了一段代碼。你可以隨便寫第一個爲

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 

有時可以省略{}當塊只包含一個聲明。

if (userValue == "1") 
    message = "You won a new car!"; 

然而,大多數人認爲即使使用它們可以省略一個好的編碼做法括號,因爲他們跳過會導致一些錯誤。爲了使它一點點清晰考慮下面的代碼

if (userValue == "1") 
    message = "You won a new car!"; 
    ReadLine(); 

這相當於

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 
ReadLine(); 

是什麼讓ReadLine執行每一次,不管userValue值。這可能不是開發人員所想的。

+0

除了最好堅持總是使用大括號,單個或多個。它可以幫助你避免那些發生意外的事故... –

+0

@MitchWheat我已經更新了我的答案。 – MarcinJuraszek

1

您的第一個示例是C#提供快捷方式的方式。編譯器將

if (userValue == "1") 
    message = "You won a new car!"; 

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 

爲完全相同。

歸結爲個人喜好,是否使用簡寫爲單行;

一個常見的例子是從功能的快速恢復:

if (isValid = false) 
    return false; 

有沒有正確或錯誤的方式做到這一點,當然,而是個人的忌諱我是當人們這樣做:

if (userValue == "1") 
    message = "You won a new car!"; 
else 
    message = "You won a hippopotamus!" 

這是一種糟糕的形式(在我的愚見),即使它會編譯。

重要的是,無論您決定編寫單行程文件,在整個代碼中與其中一種方式是一致的。

1

有沒有區別:

if (userValue == "1") 
    message = "You won a new car!"; 

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
} 

...以外風格。但是:

if (userValue == "1") 
    message = "You won a new car!"; 
    GiveNewCar(); 

現在,你出的現金,因爲大家的獲得一輛新車。如果沒有作用域塊,只有緊隨if條件的語句將被綁定到if語句的/ protected。下面的行將不會。爲了防止這種情況,你想:

if (userValue == "1") 
{ 
    message = "You won a new car!"; 
    GiveNewCar(); 
} 

現在,只有那些應得的人會得到一個。

這就是人們爲什麼經常建議總是包括範圍括號的範圍,即使他們不是非常需要的 - 爲了防止在添加第二行代碼時出現錯誤,突然間客戶的車道突然涌上了福特。

1

試想一下,如果你有

if (userValue == "1") 
    WriteLine ("You won a new car!"); 
    ReadLine(); 

在C#(和大多數語言)壓痕犯規任何區別(又名 '空白')

至於C#而言,多數民衆贊成一樣

if (userValue == "1") 
    WriteLine ("You won a new car!"); 
ReadLine(); 

這不是你想要的!因此你需要{}。單線工作,因爲編譯器可以看到最終的分號

If you are interested in languages where {} are not used and indentation is used 
    look at python 
0

大家都提到它的使用在C#中定義的代碼塊和單行的語句也不要緊,你是否有大括號或不大括號,但根據stylecop(用於強制執行一組樣式和一致性規則),它是一種很好的做法,即使您的陳述只有一行,也總是有大括號。

SA1503:CurlyBracketsMustNotBeOmittedhttp://stylecop.soyuz5.com/SA1503.html

4

但是如果你使用的代碼多行你需要{}。

這並非嚴格對稱。這更準確,以便如果您有多個聲明那麼您需要使用{},不超過一個。這裏是一個有許多行,但不需要{}

if (...) 
    try { 
    Method(); 
    } catch { 
    ... 
    } 

在這個例子中繼if行的項目有很多線,但不需要大括號一個簡單的例子。這是因爲try構造本身構成一個單一的聲明。當需要執行多條語句作爲if的一部分時,則使用{}對它們進行分組。儘管{}可以包含多個語句,但{}構造本身計算爲單個語句。

雖然有兩個值得注意的例外:標籤和聲明。兩者都是陳述,但不能在if (...)陳述後直接使用。