所以,我今天早些時候正在用C++搞亂,特別是鏈式插入操作符。我注意到了一些對我來說很奇怪的東西。鏈接插入運算符的任何其他陷阱?
#include <iostream>
using namespace std;
size_t& foo(size_t& n) {
++n;
return n;
}
int main() {
size_t bar = 5;
cout << bar << " a " << foo(bar) << " b " << bar;
cin >> bar; //Ignore this, it's only here as an easy way to keep the window open
}
運行這個,而不是讓5 a 6 b 6
實際上給6 a 6 b 5
。顯然,插入操作數是從右到左計算的,但是從左到右打印,這可以解釋爲什麼更新後的值出現在函數調用之前,以及原始值之後。
當然,這可以通過簡單地有cout foo(bar)
自己的行來解決,但我離題了。
是否還有其他奇怪的事情,我應該在鏈接插入運算符時意識到這一點?另外,有沒有人知道爲什麼插入操作符做到這一點?
啊,謝謝。我從來沒有聽說過 - 我不知道這實際上是一個問題。我最熟悉的語言是Python,我不記得這是一個問題。 – Kevin
是嗎? (cout.insert(a))。insert(b(a )))。insert(a)'和圓括號是序列點,不是嗎? (並且我運行他的程序並獲得了5 6 6 ...) – Massa
實際上,他的例子中唯一的順序點是:在對函數的所有參數進行評估之後,但在函數執行之前。繪製自己的圖形,你會發現讀取和寫入可以同時發生。所以,沒有足夠的序列點,特別是兩次讀取和一次寫入條之間沒有。 – Deduplicator