【发布时间】:2021-12-30 14:25:36
【问题描述】:
比较两个字符数组时比较运算符是如何工作的?
考虑以下程序,
#include <iostream>
using namespace std;
int main()
{
char arr1[5] = { 'T','e','s','t' };
char arr2[10] = { 't','e' };
if (arr1 < arr2)
cout << "Yes";
else if (arr1 > arr2)
cout << "No";
else
cout << "0";
}
我知道它应该打印Yes,因为arr1的第一个字符的ASCII值是84,而arr2的第一个字符的ASCII值是116所以从技术上讲它应该打印是的。
但是,这个程序在 Visual Studio 上运行时会给出No 的输出。
我认为它可能是在比较字符数组的地址。为了测试这一点,我交换了变量名并运行了这个程序,
#include <iostream>
using namespace std;
int main()
{
char arr2[5] = { 'T','e','s','t' };
char arr1[10] = { 't','e' };
if (arr1 < arr2)
cout << "Yes";
else if (arr1 > arr2)
cout << "No";
else
cout << "0";
}
但这又给出了Yes 作为输出,这意味着字符数组的地址在比较中并不重要。
谁能告诉我这个比较是如何进行的?
【问题讨论】:
-
它比较他们的地址,这几乎不是你想要的。不要求改变它们的定义顺序会改变它们的相对地址。
-
鉴于数组的内容从不使用且从不改变,编译器可以完全消除它们。
-
当您执行
arr1 < arr2时,它相当于&arr1[0] < &arr2[0]。也就是说,您比较两个完全不相关的指针。如果你想比较数组的 content,要么使用循环(但记住大小差异!),或者使用std::array、std::vector或std::string,它们具有执行适当的东西。 -
或者,因为你有两个 C 风格的空终止字符串,你可以使用
std::strcmp。但我真的建议你切换到合适的 C++ 容器。 -
operator <的行为取决于您使用的编译器。但我的直觉是编译器会比较你在初始化程序中放入的字符数。
标签: c++ arrays if-statement comparison implicit-conversion