2019年2月9日 星期六

【C++語言】一個未定義行為

我前幾天和同學說到一個有未定義行為的程式如下:
#include <cstdio>
int main()
{
  int i = 1;
  printf("%d, %d, %d\n", i++, i++, i++);
}
這個程式會發生什麼事情,大家應該可以預測,就是印出
1, 2, 3
但,事實是如此嗎?在我的Arch Linux上的gcc 8.2.1,編譯出一個程式,顯示出:
3, 2, 1
也許clang可能會成功達成我們的期望,的確clang顯示出:
1, 2, 3

那你認為clang才是正確的嗎?其實這裡每一個編譯器都有符合標準,事實上,同一個陳述裡面不應該有超過一個改變同一個變數的部分,這樣會產生未定義行為,也就是說,這個程式不該出現在世界上。其實,如果你開啟警告,這些編譯器通常也會給你警告訊息。



👉【幫我們一個忙!】👈

👋如果您喜歡這篇文章,請在下方按5個Like!
 ❤您的支持是我們最大的動力!

您只要登入帳號(Facebook、Google),在下方按5個Like,我們就會收到來自LikeCoin基金會的贊助。
您只需要支持我們,完全不會花到錢!