疑问:两个同样字符组成的字符串常量是不相等的???

时间:2021-06-30 14:00:54
c++中,当编译器遇到一个字符串常量时,就把它放到字符串池中,
也就是说两个字符串常量是保存在不同的地址中,尽管这两个字符串相同!
而实际比较的是他们的地址吗?
请看:钱能的c++程序设计教程
//ch8_16.cpp

#include <iostream.h>

void main()
{
    if("join"=="join")
        cout << "equal \n" ;
    else
        cout << "not equal \n"

}

我在Tru64和LInux2004中编译的结果均和在windows下VC6.0编译的结果一样:

    equal 

而钱能说是在c++ builder中结果为:not equal
我就是想知道这两个字符串比较实质是比较他们的地址吗?安照钱能的讲法是比较地址啊,而实际的编译却不是这样!

各位大侠能帮我解释不?谢谢!

7 个解决方案

#1


理论上是这样的
但有些编译器经过了优化

#2


那就是跟使用strcmp()差不多了?

#3


优化以后可能在一个地址!

#4


如果谁有c++builder,可以try啊,看看结果如何?谢谢!

#5


在BC3.0输出 no equal

所以是说,有些编译器经过了优化

#6


的确不一样,是因为在Tru64和LInux2004中编译的结果均和在windows下VC6.0编译中,编译器做了优化,将同样的常量字符串合并成一个常量字符串,所以他们的地址是一样的。而在在c++ builder中,默认是不作优化,所以比较就不相等了. 这一点,各个编译器都是可以通过编译选项来设置的。个人认为c++ builder不做优化是为了更加符合C++的原始想法。

#7


不错!有理,谢谢各位的答复!结贴了!

#1


理论上是这样的
但有些编译器经过了优化

#2


那就是跟使用strcmp()差不多了?

#3


优化以后可能在一个地址!

#4


如果谁有c++builder,可以try啊,看看结果如何?谢谢!

#5


在BC3.0输出 no equal

所以是说,有些编译器经过了优化

#6


的确不一样,是因为在Tru64和LInux2004中编译的结果均和在windows下VC6.0编译中,编译器做了优化,将同样的常量字符串合并成一个常量字符串,所以他们的地址是一样的。而在在c++ builder中,默认是不作优化,所以比较就不相等了. 这一点,各个编译器都是可以通过编译选项来设置的。个人认为c++ builder不做优化是为了更加符合C++的原始想法。

#7


不错!有理,谢谢各位的答复!结贴了!