【问题标题】:Why is b[2] false?为什么 b[2] 是假的?
【发布时间】:2020-02-14 15:49:42
【问题描述】:
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

b[] = {true, true, false};

为什么b[2] 是假的?

如果A==BA==C,那不应该暗示B==C吗?

【问题讨论】:

标签: c++ string stdstring string-literals equality-operator


【解决方案1】:

在这个表达式中

s.c_str()==""

比较两个指针(地址)。第一个是s.c_str() 返回的指针,第二个是指向字符串文字"" 的第一个字符(终止零字符)的指针。

很明显,地址是不同的(还要记住,字符串文字具有静态存储持续时间)。

要获得预期的结果,您应该改为编写

std::strcmp( s.c_str(), "" ) == 0

至于这两种表达方式

s==""

s==s.c_str()

然后是比较字符串,因为标准类 std::string 为右操作数重载了 operator ==。

【讨论】:

  • 在最后一种情况下,标准是否保证指针不同?我知道他们可以。
  • 只能补充说应该是UB。 “与字符串文字比较会导致未指定的行为”
  • @Jeffrey 它保证,因为至少字符串是空的。:) 但无论如何,类 std::string 使用其构造函数的参数的副本。
  • @Roout -- "UB" 表示未定义的行为"。这意味着语言定义没有告诉你**程序的行为是什么。一个带有未定义的行为不是一个有效的 C++ 程序。“未指定的行为”意味着有几个替代方案,标准并没有告诉你将选择哪一个。程序是有效的,实现可以选择任何一个替代方案。
  • @PeteBecker 一个带有 UB 的程序 is 仍然是有效的 C++ 程序(至少在它成功编译并且可以运行的意义上)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2012-04-24
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多