2017-09-13 134 views
-2

下面的代碼片段在採訪中給了我,問我有沒有可能評估for循環的所有語句?「for」循環的多條語句無塊

int i, n, t1 = 0, t2 = 1, nextTerm; 

for(int i= 0; i < 10; i++) 
{ 
    printf("%d ", t1); 
    nextTerm = t1 + t2; 
    t1 = t2; 
    t2 = nextTerm; 
} 

我問他,我認爲不可能評估for循環沒有塊的多個語句。但是,我的朋友告訴我,這是可能使用逗號運營商,像這樣:

int i, n, t1 = 0, t2 = 1, nextTerm; 

for(int i= 0; i < 10; i++) 
    printf("%d ", t1), 
    nextTerm = t1 + t2, 
    t1 = t2, 
    t2 = nextTerm; 

我知道comma運營商如何爲單行語句工作。但我想知道如何工作comma運營商多行?

另外,是否有任何其他方式來完成這項任務?

+0

這是一個單爲您的編譯器行。 –

+4

我希望面試不好,因爲相信我,你不想要這份工作。如果他們不能提出更好的面試問題,那麼表明他們是一羣業餘愛好者。 – Lundin

+0

在大多數情況下,C將換行與其他任何空格字符(例如空格)區別開來。例外情況將在引用字符串,預處理器指令等內。 –

回答

6

請注意,千萬不要寫上面的代碼或者像我要做的一樣!

您有關於多條線路的答案,而是另闢蹊徑的另一個問題寫是這樣的:

for(int i= 0; i < 10; nextTerm = t1 + t2, 
         t1 = t2, 
         t2 = nextTerm, 
         i++) 
    printf("%d ", t1); 

甚至,到了極致......

for(int i= 0; i < 10; printf("%d ", t1), 
         nextTerm = t1 + t2, 
         t1 = t2, 
         t2 = nextTerm, 
         i++) 
    /* Hey, empty loop! */; 
+0

我其實很喜歡這種風格,因爲它告訴你在循環體中沒有任何時髦('break','continue',&c。) – Bathsheba

+0

爲什麼不使用它呢? '#define FOO(x)for(in ?? = ?? = xi = 0;!prin ?? = ?? = x ?? = ?? = f(「%d」,x ?? = ?? = 1 ,NEX'='= X'='=期限= X'='= 1 + X'='= 2)| | <10; X'='= 1 = X '='= 2,X'='= 2 = NEX'='= X'='=項,I ++)?? '。稱爲'FOO(t);'。輸出:'1 1 2 3 5 8 13 21 34 55 89'(斐波那契數列) – Lundin

3

這並不重要有多少行。重要的是是否有單一的陳述。並且語句由分號分隔(;)。

從詞彙的角度看,C代碼忽略了不需要用來分隔令牌的白色空格。所以這多行語句:

printf("%d ", t1), 
nextTerm = t1 + t2, 
t1 = t2, 
t2 = nextTerm; 

是因爲雖然它被寫在一行相同的:

printf("%d ", t1), nextTerm = t1 + t2, t1 = t2, t2 = nextTerm; 

不過,雖然這可能會覺得聰明,不寫這樣的代碼。這是一個混淆的練習。

+0

使用逗號代替塊是否好? – Jayesh

+1

@Jayesh - 不!最後我寫了很多。 – StoryTeller

+0

非常感謝您先生 – Jayesh

5

這個單行語句,格式化成多行。

像這樣使用逗號運算符是完全廢話。刪除塊沒有任何目的 - 它只是讓你的代碼更危險,更難以閱讀,因爲沒有獲得任何東西。使用分號。

總是循環後使用複合語句。 即使如果循環內只有一個單一的語句 - 歷史上最昂貴的錯誤之一,「蘋果gotofail」是由寬鬆使用大括號引起的。

+2

可能值得添加一個鏈接到這個「Apple gotofail」的解釋 - > https://nakedsecurity.sophos.com/2014/02/24/anatomy-of-a-goto-fail- apples-ssl-bug-explained-plus-an-unofficial-patch//或發佈它的代碼並在你的回答中解釋它 – Rafalon

+0

@Rafalon Nah這只是一個軼事,它不是什麼問題。 – Lundin