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

问题描述

当我们比较字符串/字符格式的数字时,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