2012-11-10 114 views
2

我正在處理test.c文件並嘗試對其中的單行註釋進行計數。b = false與if(b)b = false

當我連續發現兩個/個字符時,我將slc觸發器設置爲true

而當我到達行尾時,我需要設置slc觸發器到false

當然\n字符清楚地表明單行註釋的結束。

switch (character) 
{ 
    case '\n': 
     slc = false; // single-line comment ended 
     break; 

但當\n字符發現,slc可能是要麼truefalse

switch (character) 
{ 
    case '\n': 
     if (slc) slc = false; // single-line comment ended 
     break; 

這兩個代碼塊有什麼不同嗎?

我該怎麼寫?

+0

對於第一個代碼打擾,你應該改變的評論,從'或here'東西//沒有單行註釋,因爲新行不需要一個結束。 –

+0

唯一的區別是,如果關閉優化器,後者將生成更多代碼......行爲將會相同。這不明顯嗎?在聲明結尾處'slc'必然是錯誤的。 –

+0

@JimBalter對我來說不是那麼明顯。我不確定哪種操作更容易:爲一個變量分配一些新的值,或者檢查一些條件。 –

回答

6

使用第一種形式。添加一個額外的if檢查不影響代碼的功能,只有其可讀性是不好的做法。你應該總是寫出最簡潔的方式,而不是混淆你的代碼的意圖。因爲在這種情況下,您的意圖始終是變量爲false,只需設置slc = false即可。

+0

謝謝!其實,這只是有趣的,電腦會有什麼不同。編譯器會添加一個條件來檢查變量狀態嗎? –

+1

如果您想絕對確定,請雙向編寫並反彙編二進制文件以查看編譯器的功能。我懷疑它會優化檢查,除非你禁用優化。至少需要花費幾個時鐘週期來檢查'slc'的值,而且如果隨意完成,必須使用'jmp'指令對於線程預測和流水線來說可能很粗糙。 –

+1

用-S編譯得到彙編代碼;無需拆卸。通過優化(例如-O2),兩種方法將完全相同。 –

0

頂一個的伎倆,爲什麼與if

相關問題