C++ 编译器如何解释字符串/字符中的比较逻辑?

git*_*tha 1 c++ comparison literals string-comparison character-literals

当我们比较字符串/字符格式的数字时,c++ 编译器如何解释它?下面的例子将说明这一点。

#include <iostream>
using namespace std;

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

输出是

true
Run Code Online (Sandbox Code Playgroud)

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

   arr['a']
=> arr[97]
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 5

'1'charC++ 中的一种类型,具有实现定义的值 - 尽管字符的 ASCII 值1很常见,但不能为负。

表达式arr['a']定义为每个指针算术:*(arr + 'a')。如果这超出了数组的边界,则程序的行为是未定义的。

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

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

(最后一点:在 C 中'1''2', 和'a'都是int类型。)