前段時間遇到乙個困惑,在c++語言中cout輸出的順序問題及在不同ide中有不一樣的結果(vs跟dev),以下前面都是在vs2015之中執行,最後的猜想在dev中執行。
以下是源**:
#include
"stdafx.h"
#include
using
namespace std;
static
int a=
;int
main()
圖例說明↓:
首先*p指向a[3]的值,等於7,接著執行 *(p++),由於++是後置式自增運算子,p先自增,結果在下一步體現,即 *(p++)=7;
接著第二行輸出, *(p - 2)在上一行*(p++)自增之後,應指向a[4],p-2之後指向a[2],即值為5,最後*(a + 4)指向a[4],值為11.
然而,結果卻是這樣的↓:
首先第一行cout *p , *(p++) ;於兩個cout放在同一行,cout裡面包含運算,因此先從右往左開始計算*(p++),由於是後置式的自增,值仍是等於7,但下一步的自增之後值變成11,也就是*p等於11,第一行從左往右輸出*p跟*(p++)結果就是11,7;第二行cout *(p - 2) , *(a + 4),從右往左計算*(a+4),值等於11,*(p-2),第一行p自增再減2,則p指向了a[2],值等於5,從左往右輸出的結果就是5,11.
11 7
5 11
既已得知了cout的計算順序跟輸出順序,想著繼續驗證一下
還是原來的**,但cout變了一下
#include
"stdafx.h"
#include
using
namespace std;
int a=
;int
main()
如沒意外,結果應為
從右往左計算*(p+1)等於11,由於p+1沒有給p重新賦值,則p還是等於7;第二行從右往左計算(a+4)等於11,*(p-2)指向a[1],等於3;輸出結果應為:
cout兩個的結果皆符合猜想,那麼四個的順序是否一樣呢?
#include
"stdafx.h"
#include
using
namespace std;
int a=
;int
main()
按照從右往左的計算順序,卻分析出了兩種可能性。
其一:從右往左先計算*(p++),值等於7,自增,下一步 p值等於11,再下一步 * (p++),值等於11,自增,最後一步p值等於13;所以從左往右的輸出是13 11 11 7
其二:從右往左計算*(p++),值等於7,自增,下一步的*p沒有計算,先跳過到下一步的 *(p++),值等於11,自增,*p等於13,所以從左往右的輸出是 13 11 13 7
結果看起來是第二種,也就是cout從右往左嚴格按照先計算的原則,再從左往右輸出結果。
然而,在dev上執行的結果卻不一樣
結果卻是符合第一種猜想
是不是因為不同ide的產生的結果不一樣呢?
(ps:前面cout兩個的時候dev結果跟vs一致)
解決:學了編譯原理之後,發現,對語義的不同理解可以得到不同的編譯程式,除此之外,不同版本的編譯系統翻譯出來的結果也可能不同,也不能說哪個是對的哪個是錯的,唯一可以確定的是p++的自增規則沒有變化,但由於是不同編譯器的原因,對語義也產生了不同的理解,因此結果並不一樣。
C 中cout流的輸出順序
先來看一段 includeusing namespace std int hello1 int hello2 int main int hello1 int hello2 我第一次看到這段 認為輸出的順序就是 a hello1 b hello2 但是真正的執行結果呢,我們來看看 hello2 hel...
C 輸出流cout的執行順序問題
首先看乙個例子 int fun1 int fun2 int main 輸出結果是 num2 num1 1 2 為什麼呢?為什麼不是num11num22呢?這裡涉及到cout輸出流的執行順序問題。cout的輸出順序有如下規律 計算順序 自右至左 輸出順序 自左至右 cout作為輸出流,有乙個緩衝區,先...
cout的引數輸出順序問題
今天去參加人人網筆試,遇到這樣乙個題目 問下面 的輸出是什麼?cpp view plain copy include using namespace std intg 0 template typename t intfoo intmain 乍一看,覺得這個題目沒那麼簡單,但是又想不出到底輸出什麼,...