標籤:

C++ 「==」運算符取值問題?

問題如下圖:

單獨輸出str1,str2,str3,str4,str5,str6的值都是「abc」,

可是為什麼「==」比較的時候卻有差異?


謝邀……

這就是為什麼靠譜的C++教材裡面都會寫:請用std::string來表示字元串,不要用C語言裡面的char *, char []來表示字元串……你這個問題涉及變數,數組,字元串字面值等,不錯,留著以後當面試題……

字元數組在比較的時候,會當成字元指針來比,所以「==」其實比的是兩個數組是不是指向同一個內存地址。

1:str1 == str2 ? 顯然這是棧上定義的兩個變數,不在同一地址,所以一定是false……

2:str1 == "abc" ? 「abc」是字元串字面值(literals)。標準規定變數地址是不能等於字元串字面值的,所以一定是false。

3:str3 == str4 ? 跟1一樣的道理,加const也沒啥影響,這兩個還是兩個不同的變數。

4:str5 == str6 ? 這個就有意思了。str5和str6是兩個指針,指向了兩個字元串字面值,這兩個字元串字面值還剛好相等。C++標準對這種情況的規定是:編譯器的實現可以決定讓這兩個指針指向相同的地址或不同的地址,因為這兩個指向同一地址的話,"abc"只要存一份就夠了,不用存在兩個地方浪費內存。而你恰好用了一個把它倆兒放在同一地址的編譯器……這個可以是false,也可以是true。

用std::string的話就合理多了,你可以試試……


string對象和c-style string是兩個東西

想要比較就寫string(s) == string("abc");


題主這個代碼風格,好像是把C++當C用,但C又沒學好的感覺=。=

字元串用 == 比較為什麼出現這樣的結果,藍木達大大回答的很精彩了。

在C++下可以用std::string, 而C下,有strcmp等一系列的字元串比較函數。題主可以自己實現下,會對為什麼出現這樣的結果有更深的領悟。


你寫著玩的時候, 寫個%p看看! 每個變數都有自己的地址的! (像最後面編譯器優化的除外)


請調用.equals(),==在不重載的情況下,不是基本類型比的是地址


推薦閱讀:

每次編程開始先輸入 #include,那麼計算機在讀取 # 符號的時候 正在做什麼?
C++ 和 Objective-C 都可以 100% 翻譯為 C 代碼嗎?
搞oi/acm的大神為什麼要#define N 1000+10?
運行時異常處理程序是如何實現的?
為什麼大多數程序主函數都return 0; 不return 1; ?

TAG:C | CC |