1樓:Sigon
你同事這種人還能有班上,作為即將踏進職場的畢業生感到非常難受。
看看現在為了找個4千塊的實習都得刷一堆造航母難度的題。
回到問題,之所以能得到正確結果是因為編譯器優化,將常量存在同乙個記憶體位址,而==比較的是兩個指標是否指向同乙個記憶體位址,所以得到了結果。
你同事根本沒有理解C++邏輯,完全瞎貓碰上死耗子。這種人一不注意就可能對專案產生毀滅性的影響。
就是這種水平的妖魔鬼怪擠占著崗位,讓雙一流碩士博士找幾千的實習都難。多麼諷刺啊。
2樓:DLM-fakeS
char* 是指標型別,== 這樣比的是兩個位址是否相等(也就是兩個指標是否指向相同的位址)。比如說,
const char* p1 = "abc";
const char* p2 = "abc";
if (p1 == p2) 裡面為 true。兩個相同內容的常量字面值型的字串,編譯後指向的是位於唯讀的初始化資料段中的同乙個位址。
char str = "abc"; //這裡在棧上宣告的 str,屬於另乙個儲存位置。
if(p1 == str) 裡面為 false。
c++ 裡的 std::string 是乙個類,定義了 operator == ,所以兩個物件用 == 進行比較,比較的是字串的值。
3樓:vvzh017
看書上說:「由於C-串型別是字元指標,因此,比較兩個相同C-串的時候,會因空間位置的不同而不同」,然後分別用vs2012和DEVC++試了一下,好像確實可以直接比較啊,並且兩個指標指的位址不一樣,但是的確是可以進行判斷。
4樓:sin1080
把字串常量賦值給char*而不是const char*。
比較指標的操作,腦子裡當作比較內容的語義。
依賴編譯器優化來實現邏輯,玩UB。
重點是,不以為恥,反以為榮。
感覺你跟這種人同事(看起來還是老同事?),估計技術環境肯定糟透了,趕緊跳槽吧。
5樓:SuperFashi
你的同事屬於碰巧對的,千萬不要學。你可以cout一下&(pStr1[0])和&(pStr2[0])就知道為什麼了。
不過C++ 為什麼要用 char*,string類不好嗎?string的比較就可以直接拿==了來做了。
6樓:SuperSodaSea
簡單地說,編譯器有可能會把兩個相同的字串字面量優化為存到同乙個地方(但不一定會這樣做)。要比較字串的話還是老老實實用 strcmp 好。
另外把字串字面量直接賦值給 char* 在 C++11 已經被禁止了,硬要賦值的話得加上 const_cast。
C 中比較字串用 Equals 還是 ?
竹本祐太 操作符過載是c 留給家族語言的重要遺產,所以我在多數場景下都推薦使用 並且應該給自己的類實現這個操作符過載。對於使用者來說,至少有下面兩點好處 避免空指標異常,可以少一行空指標判斷 檢查物件型別,當物件型別不一致時,編譯器會直接報告,而不是等到執行時。當然equals也不是一無是處,因為e...
將C風格字串結尾字元改成其他字元(比如char a 「12」 a 2 f )會發生什麼?
50包郵 在微控制器程式設計裡面,一般用串列埠發字串的函式會有一句while s 0 來檢測字串是否發完 如果你把這個改過屁股的字串扔進去你會在串列埠助手收到除了 12 以外一堆很長的亂七八糟的東西 桃又 你如果再把它當C風格字串來讀,它就會讀到天荒地老直到遇見乙個 0。良心的VC 在除錯模式下會把...
C語言字串如何賦值及輸出?
那個人 你這不是字串賦值,而是字串指標賦值。你定義的是乙個字串指標,指向的是字串常量的起始位址。字串定義 char buf LEN 賦值 strcpy buf,string 或sprintf buf,s string 先不用嘟嘟嘟,p abc 其他不變 首先執行時記憶體裡面會有乙個位置儲存 abc ...