当B大于a时,为什么C不大于b?
Visual C ++ 2017 STL中的代码:
void main ()
{
cout << ("A" > "A") << endl;
cout << ("a" > "A")<< endl;
cout << ("B" > "a")<< endl;
cout << ("b" > "B")<< endl;
cout << ("C" > "b")<< endl;
cout << ("c" > "C")<< endl;
cout << ("AA" > "c")<< endl;
cout << ("Aa" > "AA")<< endl;
cout << ("aA" > "AA")<< endl;
cout << ("aa" > "aA")<< endl;
cout << ("BA" > "aa")<< endl;
cout << ("Ba" > "BA")<< endl;
cout << ("D" > "c")<< endl;
string pause;
cin >> pause;
}
输出: 0 1 1 1 0 1 1 1 1 1 1 1 1
答案 0 :(得分:6)
答案 1 :(得分:3)
您正在比较指针。
"A"
是指向字符的指针。 (Actaully const char [2]在评论中指出)
'A'
是一个角色。
试试这个:
int main ()
{
cout << ('A' > 'A') << endl;
cout << ('a' > 'A')<< endl;
cout << ('B' > 'a')<< endl;
cout << ('b' > 'B')<< endl;
cout << ('C' > 'b')<< endl;
cout << ('c' > 'C')<< endl;
}
您现在需要从字符串(或字符数组)中考虑您想要的内容。
是&#34; AA&#34;少于或大于&#34; c&#34;?它首先出现在字典中,但它更短。
如果你想要&#34;字典&#34; (词法)命令你需要比较字符串; strcmp
或查看string comparision operators(如果您决定使用std :: string)
答案 2 :(得分:0)
在像这样的陈述中
cout << ("A" > "A") << endl;
cout << ("a" > "A")<< endl;
cout << ("B" > "a")<< endl;
//...
使用了具有静态存储持续时间的字符串文字。在C ++中,字符串文字具有常量字符数组的类型。例如,字符串文字"A"
的类型为const char[2]
,因为在内存中它的存储方式与{ 'A', '\0' }
类似。
执行此声明
std::cout << sizeof( "A" ) << std::endl;
你会看到结果是2。
来自C ++标准(2.13.5字符串文字)
8也引用普通的字符串文字和UTF-8字符串文字 作为窄字符串文字。 窄字符串文字有类型 “n const char数组”,其中n是定义的字符串的大小 以下,并具有静态存储时间(3.7)。
在像这样的"A" > "A"
表达式中,数组被隐式转换为指向其第一个字符的指针。所以在这个表达式中比较了两个指针。
从C ++标准(4.2数组到指针转换)
1“N T数组”或“未知数组”的左值或右值 T“的绑定可以转换为”指向T“的类型的prvalue。该 应用临时物化转换(4.4)。 结果是 指向数组第一个元素的指针。
通常,具有相同内容的字符串文字不必存储为一个字符数组。所以实际上是这个表达式
"A" == "A"
可以产生true
或false
,具体取决于编译器选项,即这两个字符串文字是由编译器存储为一个数组还是存储为两个不同的数组。
您的编译器似乎将相等的字符串文字存储为一个数组。在这种情况下这个陈述
cout << ("A" > "A") << endl;
输出0。
此外,似乎编译器将存储字符串文字"a"
的数组放在存储字符串文字"A"
的数组之后。因此字符串文字"a"
的第一个字符的地址(字符'a'
)高于字符串文字"A"
的第一个字符的地址。所以这句话
cout << ("a" > "A")<< endl;
输出1。
此外,编译器将存储字符串文字"B"
的数组放在存储字符串文字"a"
的数组之后。因此,字符串文字"B"
的第一个字符的地址再次高于字符串文字"a"
的第一个字符的地址,并且在此语句中
cout << ("B" > "a")<< endl;
比较了这些地址。所以声明输出1.
等等。
您需要做的是比较字符文字而不是字符串文字。例如
cout << ( 'A' > 'A') << endl;
cout << ('a' > 'A')<< endl;
cout << ('B' > 'a')<< endl;
//...