2008/01/08

計概考題

int a = 0;
int b = 1;
if ((a=1) || (b=2)) {
printf("Hello, a=%d, b=%d", a, b);
}
else {
printf("World! a=%d, b=%d", a, b);
}


令我出乎意料的,結果是「Hello, a=1, b=1」,也就是說「||」在第一個判斷成立以後不會執行第二個判斷。

不過,這題題目其實是要考你 if 必須注意不可將「==」打成「=」。但是既然是錯誤的程式碼,還要我們告訴他執行結果,我很想知道出題老師在想什麼。

10 則留言:

  1. 這是"對"的
    if裡面只要是"評算式"就是合法
    在a被指定完以後它會評算a的值

    短路評算也是C標準規定的
    (不過在C++的場合,overload過的運算子不會有短路評算)

    回覆刪除
  2. 題意就跟小學時候的改錯用意一樣囉

    回覆刪除
  3. 這不是計概老師出的啦,是外面在應徵Software Engineer的題目

    回覆刪除
  4. 這語法應該是成立的吧!?
    考你熟析度吧!?

    btw, 這是C ? 還是 C like ?

    回覆刪除
  5. 這是C
    把(a=1) || (b=2)改成(1=a) || (2=b)
    這樣在compile time就會出錯
    必須改成(1==a) || (2==b)才能通過

    回覆刪除
  6. 「球關」應該是「loveflames」吧
    就算這是面試考題也跟計概有關,不過這到是蠻有意思的。

    這你所說的 1=a 在編譯上一定是錯誤,不過應該不會有人這樣做來降低可讀性吧?

    回覆刪除
  7. 1==a的寫法其實很常用
    這是防止typo的寫法
    a == 1錯打成a = 1在compile time不會出錯
    但是1 == a錯打成1 = a就可以馬上發現

    回覆刪除
  8. 好聰明的技倆……記起來!

    回覆刪除
  9. 路人來亂入一下

    會不會是也考Short-circuit evaluation...
    XD

    順便機會教育一下(眾毆)

    回覆刪除

  10. Short-circuit evaluation

    回覆刪除