C++ 编译器如何解释 string/character 中的比较逻辑?

How do C++ compiler interpret comparison logic in string/character?

当我们比较 string/character 格式的数字时,c++ 编译器如何解释它?下面的例子会很清楚。

#include <iostream>
using namespace std;

int main() {
// your code goes here
    if ('1'<'2')
        cout<<"true";
    return 0;
}

输出为

true

编译器内部发生了什么?是否存在从字符串到整数的隐式转换,就像我们使用字符引用数组中的索引时一样,

   arr['a']
=> arr[97]

'1' 是 C++ 中的 char 类型,具有实现定义的值 - 尽管字符 1 的 ASCII 值很常见,并且不能为负数。

表达式arr['a'] 是根据指针算法定义的:*(arr + 'a')。如果这超出了数组的范围,那么程序的行为是未定义的。

请注意,'1' < '2' 在任何平台上都是 true。不能说 'a' < 'b' 总是 true,尽管我从来没有遇到过不是 true 的平台。也就是说,在 ASCII 中 'A' 小于 'a',但在 EBCDIC 中(在所有变体中)'A' 大于 'a'!

"ab" < "cd" 这样的表达式的行为是 未指定的 。这是因为 const char[3] 常量都衰减为 const char* 类型,并且未指定比较两个不指向同一数组中对象的指针的行为。

(最后说明:在 C 中 '1''2''a' 都是 int 类型。)

操作数 '1''2' 不是字符串,它们是 char literals.

字符表示类型 char 的特定数字,通常由 ASCII table 定义,特别是 49 代表 '1'50 代表 '2'.

运算符<比较这些数字,由于'1'的数字表示小于'2''1'<'2'的结果是true.