在C++中,
(x == "x")
和("x" == x)
比较有什么区别?假设x
是一个std::string
,是否有任何原因使一种方法优于另一种方法?请注意,括号的位置不同。(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::string
到 const char*
没有隐式转换运算符,但是从 const char*
到 std::string
有隐式构造函数。
编辑:
在 g++ 4.4.5 上,这两个比较都可以工作。
bool operator==(const char *, const std::string&)
和bool operator==(const std::string&, const char *)
的重载,而不是依赖于隐式转换。当然,这些重载可以调用另一个版本。 - Chris Lutz当我在别人的代码中看到这种写法时,我最讨厌的事情之一就是这个。我知道它的意思以及为什么有些人会这样做(“如果我不小心打错'='怎么办?”)。对我来说,这很像一个孩子走下楼梯时大声数步数。
无论如何,这里是我反对它的理由:
- 它破坏了阅读程序代码的自然流程。我们人类说“如果值为零”,而不是“如果零是值”。
- 现代编译器会在条件中出现赋值时警告你,或者实际上,如果你的条件只包含那个赋值,那么看起来确实可疑
- 如果你是一个程序员,在比较值时不应该忘记放双等号。你也可能忘记在测试不相等时放“!”。
-膜拜吧
啊,是的,“Yoda条件”(“如果值为零,则必须执行此代码!”)。我总是指向那些声称他们在像lint(1)这样的工具上更好的人。这个特定的问题自70年代末以来就已经解决了。大多数现代语言甚至不会编译它,因为它们拒绝将赋值的结果强制转换为布尔值。
正如其他人所说,这当然不是一个问题,但它确实引起了一些认知失调。
-TMN
我更喜欢使用NSString...
([x isEqualToString:@"x"])
或适用于C字符串
strcmp(str1,str2);
这两个条件之间没有任何区别,除了可能有一些内部的东西。就像你手里拿着两件东西,每只手拿一件,然后比较它们 - 然后基于每个物品在哪只手中来计算。...这不是一个因素。
const char[]
。 - Chris Lutz