【问题标题】:Comparison in C++C++ 中的比较
【发布时间】:2011-05-29 06:08:17
【问题描述】:

在比较两个 const char * 方面,这是否是 C++ 中的有效代码

const char * t1="test1";
const char * t2="test2";

t2 = "test1";
if ( t1 == t2 ) {

cout << "t1=t2=" << t1 << endl;

}   

不使用strcmp

【问题讨论】:

  • 它是有效的,但它并没有做你想要的。

标签: c++ comparison char constants


【解决方案1】:

它是有效的,但它并没有像你认为的那样做。指针上的== 检查它们是否指向相同的内存地址。如果您在不同的位置有两个相同的字符串,它将不起作用。

如果您熟悉 Python,这类似于该语言中 is== 之间的区别。

【讨论】:

  • ==.equals() 在 Java wrt 对象中。
  • 我明白了,我想知道为什么它可以工作并返回正确的结果,似乎在编译程序时,编译器优化程序将 t1 和 t2 指向相同的内存地址,而不管初始“ test2" 和后来的 "test1" 分配给 t2,
  • @kay:对,编译器优化称为“字符串池”。现在的编译器已经实现了这种优化(Visual C++ has a compiler switch specifically for this)。
【解决方案2】:

不,您是在比较指针值(即:地址),而不是它们的内容。该代码并非无效,只是可能没有达到您的预期。

在 C++ 中,您应该避免使用 const char * 并使用 std::string

#include <string>

std::string t1("test1");
std::string t2("test2");
if (t1 == t2) {
    /* ... */
}

【讨论】:

  • OP 注意:这是因为std::string 重载了== 运算符,因此可以通过逐个字符的词法比较来执行正确的字符串比较。 char* 指针不是这样。
  • 我明白了,但它神奇地起作用,是因为编译器优化为这两者分配了相同的地址吗?
  • @kay: 是的,因为两个指针都指向字符串字面量,所以编译器可能会重复使用同一个指针两次
  • @kay:它“神奇地”起作用是因为std::string 类重载了== 运算符,因此它可以正确比较实际字符串而不是指向字符数组的指针。
  • @kay:请参阅与您的评论相关的this question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 2014-05-09
  • 2012-10-14
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多