C++中的字符串比较

3
在C++中,(x == "x")("x" == x)比较有什么区别?假设x是一个std::string,是否有任何原因使一种方法优于另一种方法?请注意,括号的位置不同。
5个回答

5

一个是字符串字面量"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.

除此之外,实际上没有什么区别。

1
我认为技术上正在尝试分配给 const char[] - Chris Lutz
这是一种不好的做法,会降低代码的可读性。关于这个问题在Programmers.SE上有过讨论,我正在努力找到它。 - Mateen Ulhaq
2
编译器的开发人员现在已经注意到了这一点,并在任何情况下都会发出警告。 - Bo Persson
1
是的,我同意这是一种不好的实践。我只是为了完整性而添加了它,“一些人提倡”这个说法。就我个人而言,我从来不写这个。 - Lstor

1

我认为这两个调用都将导致调用 bool std::string operator==(const std::string&, const std::string&)

这是因为从 std::stringconst 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

1

这里讲述了关于Yoda条件语句现已关闭的问题

当我在别人的代码中看到这种写法时,我最讨厌的事情之一就是这个。我知道它的意思以及为什么有些人会这样做(“如果我不小心打错'='怎么办?”)。对我来说,这很像一个孩子走下楼梯时大声数步数。

无论如何,这里是我反对它的理由:

  • 它破坏了阅读程序代码的自然流程。我们人类说“如果值为零”,而不是“如果零是值”。
  • 现代编译器会在条件中出现赋值时警告你,或者实际上,如果你的条件只包含那个赋值,那么看起来确实可疑
  • 如果你是一个程序员,在比较值时不应该忘记放双等号。你也可能忘记在测试不相等时放“!”。

-膜拜吧


被接受的答案

啊,是的,“Yoda条件”(“如果值为零,则必须执行此代码!”)。我总是指向那些声称他们在像lint(1)这样的工具上更好的人。这个特定的问题自70年代末以来就已经解决了。大多数现代语言甚至不会编译它,因为它们拒绝将赋值的结果强制转换为布尔值。

正如其他人所说,这当然不是一个问题,但它确实引起了一些认知失调。

-TMN


0

我更喜欢使用NSString...

([x isEqualToString:@"x"]) 

或适用于C字符串

strcmp(str1,str2);

有Objective-C++,但我真的不理解那些更喜欢使用Foundation类而不是C++标准库的人。 - Begemoth

0

这两个条件之间没有任何区别,除了可能有一些内部的东西。就像你手里拿着两件东西,每只手拿一件,然后比较它们 - 然后基于每个物品在哪只手中来计算。...这不是一个因素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接