標籤:

【for(int i=10, j=1; i=j=0; i++, j--)()】將循環幾次?

《迅雷 2016 C++ 工程師的一道選擇題》 來自伯樂在線官方微博

迅雷 2016 C++ 工程師的一道選擇題

答案是0次還是無限循環?

在for循環第二個語句里這樣寫是未定義行為嗎?


for(int i=10, j=1; i=j=0; i++, j--)()

最後的是全形括弧()??肯定編譯不過吧。

如果是 {} ,那答案是0次,因為 i = j = 0 也是一個表達式,其值為 0 代表這個 for 的 condition 是 false,不執行 body。

--

更新,寫成這種形式會容易理解一點:

int i = 10, j = 1;
while (i = j = 0) {
// body
i++, j--;
}

.


這並不是一道未定義的題目,大家也都說清楚為什麼是0次。而針對某些黑C++的簡直看不下去啊,其實C也是有這樣的用法,而且還使用在了微軟的C標準庫中,參看下面第二個while循環,本質和這道題目類似。

char * __cdecl strcat (
char * dst,
const char * src
)
{
char * cp = dst;

while( *cp )
cp++; /* find end of dst */

while( *cp++ = *src++ ) ; /* Copy src to end of dst */

return( dst ); /* return dst */

}


0次。

不是未定義。


int i=0,j; for(j=3;i=j=0;i++,j++)循環多少次? - RednaxelaFX 的回答


首先,C/C++畢竟不是Java、C#……

for (initializer; condition; expression)

這裡condition,在Java、C#中都要求是boolean類型的,C/C++是看你的表達式計算結果的,是0為False,其他為True

i=j=0,這個表達式的結果是0(只有=運算符,結合性從右向左,先做(j=0),返回0,再做(i=0),返回0),為False,循環體就一次也不做了。

for循環奇怪的利用法還有很多,比如:

有多組輸入輸出,先輸入組數T(不需要輸出Case #1、#2)的時候:

for(scanf("%d",T);T--;){}

遍歷一個鄰接鏈表中起點為x的所有有向邊:

for(int i=head[x];i;i=next[i])

上面是oi選手用數組模擬指針形式,下面的更像正常的數據結構里的一點:

for(Node* p=head[x];p;p=p-&>next)

更多奇淫技巧,參見《短碼之美》

——當然,工程項目里這麼偷懶就太不講道理了,應該老老實實的,怎麼容易讀怎麼寫


for(int i=10, j=1; i=j=0; i++, j--)()

我認為的答案是 0 次,

邏輯是這樣的:按照 VC 某版本的 for loop 的 pattern:

(1)i=10,j=1; goto (3)

(2)i++, j--;

(3)if ! (i = j = 0) goto (6)

(4)() 循環體

(5)goto (2);

(6)後續

--

如果循環體(4)中出現有 continue 則 goto (2);break 則 goto (6);

哦,對了,看了別人的答案,我才意識到,應該強調一下,i = j = 0,是一個連續賦值的語句,該表達式的值是 i,即相當於 FALSE。

也有人提到用逗號連起來的語句:a, b, c; 這個表達式的值是 c。這種基礎知識是 c++ 程序員應當知道的。

比如說:

int i;

for(i = 0; i &< 10; i++) {}

這個循環正常結束(沒有通過 break 中止)後,i 的值是 10;

最後面的那個表達式 i++ ,邏輯上可以被認為是循環體的 trailer。即,循環體 + trailer ,構成完整的一次循環。


這多明顯的答案啊,一個等號表示賦值,for循環初始化之後先按照條件進行判斷,然後條件是i=j=0,就是把0賦值給j,然後賦值給i,這樣判斷就相當於是0,false,當然不進入循環了

這連我都會的題目迅雷還拿來招人……


是0。

後面的()是專門填答案用的。


原來公司試題就這水平(? ?;)


討論 BAT 的題也就罷了,為啥還要討論這種公司的題目?


這是在過濾掉聰明人,然後招一批傻X進去進行壓榨。


一眼看過去是 0次, 感覺沒有一丁點難度。

且慢! 圓括弧是啥?


這種題做出來,又有何用?做搬磚的人出的題永遠都是搬磚的


(bool)(i = j = 0) // false


i=j=0, 先把0賦值給j,然後把j賦值給i作為循環condition,condition條件為false(i = 0), 所以不執行了跳出循環。


賦值表達式的返回值就是所賦的值(否則就不能進行連等操作了),for裡面的第二個語句可以看成條件判斷,if(i=j=0)相當於if(0),所以不進入循環。然後,這貌似和c++晦澀不晦澀沒有半毛錢關係。

事實上這道題目核心點和for無關,只在於語句的返回值到底為多少,那麼帶逗號的多語句的語句返回值是哪個呢?答案是最後一個語句的返回值,一張說明問題。


不是未定義,你基礎太差了


我覺得這道題很好啊,一道題裡面考查了兩個很重要的東西:1 賦值表達式 2 for語句中第二個部分的意義(你還別說,很多人只要那裡寫的不是i&


一共就兩個考點:

  1. 表達式的返回值:任何一個能看懂a=b=1這種寫法的都應該自然的明白這裡的問題(如果等號沒有返回值,怎麼可能寫連等,你以為有專門的語法糖嗎?)

  2. for的執行順序:不太能想像點開這個這道題的人有人不懂這個。

我認為1分鐘(這個時限已經充分照顧到「聰明人」了)之內連這種題都解決不了最好還是換個語言比較好,你搬磚也只能搬別人剩下的。

怎麼寫代碼是一回事,能不能看懂是另一回事。你當然可以在任何語言中都只寫最淺顯易懂的一部分,但是你不應該只能看懂最淺顯易懂的一部分。


考的是表達式的值,在cpp primer.循環那個章節裡面。


推薦閱讀:

無編程基礎,跳過C直接學C++,壞處是學習難度陡峭,還是會有知識缺陷,還是二者都有?
關於《深度探索C++對象模型》有一段話看不懂?
輪子哥可以分享一下曾經是怎樣帶學生的嗎?
cout 和 cin 的底層實現是怎樣的?
C++中if(a!=b)和if(a^b)哪個效率更高?

TAG:筆試 | C |