亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對下面代碼的輸出如何解釋?不太明白

對下面代碼的輸出如何解釋?不太明白

C++
MYYA 2023-04-18 11:15:04
#include <iostream>using namespace std;int main(){ int i=0; cout<<i++<<" "<<i++<<endl;//輸出1 0 i=0; cout<<++i<<" "<<++i<<endl;//輸出2 2}
查看完整描述

2 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

請不要再糾結這種和編譯器細節有關的東西了,因為第一你不需要了解,第二如果你需要了解那只能是你在寫這個編譯器,第三你了解的再多也可能和平臺、CPU等有關系——他們隨時可以變化。一句話,這不是推薦的代碼風格,請避免這種寫法。

我在我的Mac上用i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)測試,結果和你說的一樣。

可能出現這種情況的理由是:

cout<<i++<<" "<<i++<<endl;//輸出1 0

等價于

operator<<( operator<<( operator<<(cout, i++), " "), i++);


查看完整回答
反對 回復 2023-04-21
?
隔江千里

TA貢獻1906條經驗 獲得超10個贊

我記得曾經有過這樣一個問題,C語言中:

#include <stdio.h>int main(){    int a, b;
    a = 2;
    b = (++a) * (++a) * (++a);    printf("%d\n", b);    return 0;
}

gcc輸出結果是80,但是TC的結果是60。據我們幾個人推測原因是,gcc編譯器是這樣處理的:

    a = ++a;                //a == 3 
    a = ++a;                //a == 4
    b = a * a               //b == 4 * 4==16
    a = ++a;                //a == 5
    b = b * a;              //b == 16 * 5 == 80

而TC編譯器是這樣處理的:

    a = ++a;                //a == 3
    b = 3 * (++a);
    a = ++a;                //a == 4
    b = 3 * 4;
    a = ++a;                //a == 5
    b = b * a;              //b == 12 * 5 == 60

個人理解呢,C語言也好C++也好只是一種標準,每個編譯器在不違反標準的前提下有自己實現的辦法,所以在寫代碼的時候注意不要寫這種模棱兩可的東西,不然移植性太差,以及容易出各種問題。事實上也沒必要深究,除非是研究需要之類的。


查看完整回答
反對 回復 2023-04-21
  • 2 回答
  • 0 關注
  • 160 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號