比较条件中的字符串,而不将它们声明为字符串
comparing strings inside conditional without declaring them as strings
以下条件显然是假的
string e = "English", c = "Chemistry";
if (e < c) ... // this is False
但无论任何顺序如何,以下证明都是正确的:
if("English" < "Chemistry") ...//True
if("Chemistry" < "English") ... //also True
为什么它的行为是这样的?我不明白以上两个条件怎么可能都是真的。
它是
比较的指针的值。所以这取决于编译器。
您需要对字符串使用 strcmp
或比较运算符。
"English"
的类型const char[]
,衰减为char const *
类型:也就是说,它实际上是指向存储初始E
的内存位置的指针。
当你写的时候
string e = "English"
您正在隐式调用由类型 string
定义的转换构造函数,该构造函数采用char *
并创建一个string
:
string e("English")
在这一点上,e < c
等效于 e.operator<(c)
,它实际上调用string.operator<
并执行字符串比较。
但是当你直接比较"English"
和"Chemistry"
时,你没有任何string
对象,所以你实际上只是比较指针——内存位置——结果是不可预测的。相反,您需要使用标准strcmp
函数:
strcmp("English", "Chemistry") < 0 // false: English is not less than Chemistry
字符串文字只是"C-string",即指向字符的指针。由于它们是指针,因此您可以在它们上使用一些算术运算符,但是如果您在不同的机器上运行程序,或者只是多次运行,您可能会得到不同的答案。
如果你想比较两个std::string
,你可以使用类似的东西:
if (std::string("English") < "Chemistry")
请注意,至少在字符串上必须是std::string
。
相关文章:
- public:静态常量字符串声明/初始化问题
- 如何修复范围内的字符串声明错误
- C++代码中奇怪的未使用的静态字符串声明
- C++,字符串声明中的其他字符
- NetBeans IDE 8.2 C++字符串声明问题
- 字符串声明/引用参数(c++)的困难
- 字符串声明中的结构定义中的字符串声明
- 用变量字符串声明设置容器
- C#到C代码P/调用多个std:字符串声明导致堆栈损坏
- 为什么"auto"将字符串声明为 const char* 而不是 std::string?
- 这个简单(?C++字符串声明问题似乎已经击败了StackExchange
- C++ 中的运行时错误字符串声明
- 字符串声明
- C++字符串声明
- 我收到错误:字符串声明上的 C2501
- 未初始化时的字符串声明初始长度
- 使用字符串声明变量类型
- 将私有字符串声明为引用是否会产生影响
- C++字符串声明
- 在c++中将字符串声明为std:string