簡體   English   中英

c++ 中的字符串比較

[英]String compare in c++

C++ 中的(x == "x")("x" == x)比較有什么區別? 假設x是一個std::string 有什么理由為什么一個人會比另一個人更受歡迎?

一個是字符串文字"X" ,另一個是std::string的實例。 一些人主張在左側使用常量"x" ,因為這樣如果使用賦值=而不是相等==則會出現編譯器錯誤:

if ("x" = x) // Error! Trying to assign to const char[]

if (x = "x") // Setting the value of x to be "x", and evaluating "x". 
             // Probably not what you want.

除此之外,真的沒有什么區別。

我認為這兩個調用都會導致調用bool std::string operator==(const std::string&, const std::string&)

這是因為從std::stringconst char*沒有隱式轉換運算符,但是從const char*std::string有隱式構造函數。

編輯:

在 g++ 4.4.5 上,兩個比較都有效。

這里說的是關於尤達條件現已結束的問題

當我在別人的代碼中看到它時,這是我最討厭的事情之一。 我知道這意味着什么以及為什么有些人這樣做(“如果我不小心把'='代替了怎么辦?”)。 對我來說,這就像一個孩子下樓梯時大聲數步數一樣。

無論如何,這是我的 arguments 反對它:

  • 它破壞了閱讀程序代碼的自然流程。 我們人類會說“如果價值為零”而不是“如果零就是價值”。
  • 現代編譯器會在您的條件中有賦值時警告您,或者實際上如果您的條件僅包含該賦值,是的,無論如何看起來都是可疑的
  • 如果您是程序員,則在比較值時不應忘記輸入雙 '='。 你還不如忘記放“。” 在測試不等式時。

-莫朱巴


接受的答案

啊,是的,“尤達條件”(“如果值為零,則必須執行此代碼。”)。 我總是指出任何聲稱他們在 lint(1) 之類的工具上“更好”的人。 自 70 年代后期以來,這個特殊問題已經得到解決,大多數現代語言甚至都不會編譯它。 因為他們拒絕將分配的結果強制為布爾值。

正如其他人所說,這當然不是問題,但確實會引起一些認知失調。

- TMN

這兩個條件之間沒有區別,除了可能是內部的東西。 這就像你手里拿着兩件東西,每只手拿一個,然后比較它們——然后根據每個人在哪只手上進行計算。......這不是一個因素。

我更喜歡使用 NSStrings ...

([x isEqualToString:@"x"]) 

或用於 c 字符串

strcmp(str1,str2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM