可以相互比较符号吗?
#include <iostream>
using namespace std;// For Example, Why if "k = 4" it outputs "r o" ? //
int main() {
char word[] = "programming";
int k;
cin >> k;
for (int i = 0; i < k; i++)
if (word[i] > word[i + 1]) {
cout << word[i] << endl;
}
}
char
数据类型是积分类型,这意味着基础值存储为整数。此外,char
变量存储的整数是整数作为ASCII字符。
ASCII指定了一种将英文字符(以及其他一些符号(映射到0
和127
之间的数字的方法。也就是说,每个英文字符(以及其他一些符号(都有一个介于0
和127
之间的对应数字。这个数字被正式称为代码点。
例如,英文字符a
的代码点是97
。类似地,英文字符H
的代码点是72
。你可以在这里找到所有字符的代码点列表。
这里需要注意的重要一点是,char
变量的基本值存储为整数。让我们举几个例子来澄清这一点,
char var1 = 'a'; //here var1 is stored as the integer 97
char var2 = 'H'; //here var2 is stored as the integer 72
在上面的片段中,var1
被存储为整数97
,因为英文字符a
的代码点是97
。类似地,var2
被存储为整数72
,因为英文字符H
对应于代码点72
。
现在让我们回到您最初的问题。特别是k =4
时会发生什么。
对于k = 4
,for
循环将被执行4
次。
迭代0:此处为i = 0
if
块基本上翻译为:
if (word[0] > word[0 + 1]) {
cout << word[0] << endl;
}
即:
if ('p' > 'r') {
cout << 'p' << endl;
}
即(使用ascii表(:
if (112 > 114) {
cout << 'p' << endl;
}
由于if
内部的条件是false
,因此if
块的主体将不会被执行,也不会得到任何输出。
迭代1:此处为i = 1
if
块基本上翻译为:
if (word[1] > word[1 + 1]) {
cout << word[1] << endl;
}
即:
if ('r' > 'o') {
cout << 'r' << endl;
}
即(使用ascii表(:
if (114 > 111) {
cout << 'r' << endl;
}
由于if
内部的条件是true
,因此将执行if
块的主体,并且您将获得r
作为输出(后面跟着一个换行符(。
迭代2:此处为i = 2
if
块基本上翻译为:
if (word[2] > word[2 + 1]) {
cout << word[2] << endl;
}
即:
if ('o' > 'g') {
cout << 'o' << endl;
}
即(使用ascii表(:
if (111 > 103) {
cout << 'o' << endl;
}
由于if
内部的条件是true
,因此将执行if
块的主体,并且您将获得o
作为输出(后面跟着一个换行符(。
迭代3:此处为i = 3
if
块基本上转换为:
if (word[3] > word[3 + 1]) {
cout << word[3] << endl;
}
即:
if ('g' > 'r') {
cout << 'g' << endl;
}
即(使用ascii表(:
if (103 > 114) {
cout << 'g' << endl;
}
由于if
内部的条件是false
,因此不会执行if
块的主体,也不会得到任何输出。
因此,你得到了输出:
r
o
可以相互比较符号吗?
是的,可以。
为什么如果"k=4〃;它输出"0";r o">
字符类型是整数。字符类型的每个整数值都映射到一个符号1。这种映射称为字符集或字符编码。
在运行程序的系统的字符编码中,映射到符号"r"的字符的值比映射到字符"o"的字符大,而"o"字符的值则比映射到"g"的字符小。
1这是一种简化。有一些特殊的不可打印字符,如null终止符,它们本身并不是符号。此外,在可变长度编码(Unicode(的情况下,映射并不是那么简单。