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
.
当我们比较 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
.