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