我让程序按预期工作,但任何人都可以解释 它是如何工作的吗?
#include <iostream>
using namespace std;
int main(void) {
int exit;
string name;
cin >> name;
for (int i = 0; i < name.length(); i++) {
// the line below is the one I don't understand
if ('a' <= name[i] && name[i] <= 'z') name[i] = char(((int)name[i]) - 32);
}
cout << name;
cin >> exit;
return 0;
}
编辑:让我改写一下:
我不明白的是字符串到数组的交易是如何工作的,如:
'a'<= name[i]
。具体到底是什么比较以及如何比较?
EDIT2 感谢快速反应的人,爱你们。我想通了。
答案 0 :(得分:3)
这是一行:
if('a'<=name[i] && name[i]<='z')name[i]=char(((int)name[i])-32);
细分:
if( 'a'<=name[i] ) {
if( name[i]<='z' ) {
// name_int is a temporary, which the above code implicitly creates,
// but doesn't give a name to:
int name_int = name[i];
name_int = name_int - 32;
name[i] = char(name_int);
}
}
并注意32
恰好等于您使用的字符编码中的'a'-'A'
。
(技术上name_int
应该是int&&
或某些,但不需要那么令人困惑。)
答案 1 :(得分:2)
我假设您在评论中的编辑中想知道[]
如何应用于string
对象。 []
的运算符string
被重载,以返回对所表示字符串的指定位置偏移处的字符的引用。不需要将string
直接转换为数组。实现重载的代码很可能是遍历链表。这取决于string
的实施方式。
答案 2 :(得分:1)
它假定ASCII字符格式从小写字母转换为大写,从原始ASCII值中减去32。这是因为大写的ASCII值小于小写的ASCII值,它是A
和a
,B
和b
之间的常数差异,依此类推。
答案 3 :(得分:1)
'a' <= name[i] && name[i] <= 'z'
此行正在比较这两个字符的相应ASCII值。 ASCII中的'a'
为97,'z'
为122.如果name[i]
是'a'
到'z'
中的一个字符,则表达式返回true。这通常用于检查变量是否为字母。
答案 4 :(得分:0)
if ('a' <= name[i] && name[i] <= 'z')
char
个对象是与int类似的数值。所以'a' <= name[i]
只是测试'a'
的数值是否小于或等于您正在检查的字符。结合name[i] <= 'z'
,您正在测试name[i]
的数值是否介于'a'
和'z'
的值之间。现在,恰好将用于为char
分配数值的最常见方案命名为“美国信息交换标准码”(ASCII),字母按顺序排列; 'a' + 1 = 'b'
,'b' + 1 = 'c'
,依此类推。因此,弄清楚角色是否在'a'
和'z'
之间会告诉您它是否是小写字母。
name[i] = char(((int)name[i]) - 32);
一旦您知道char
只是数值,您可以从我们在小学就读的算术的基本属性中推断'a' + ('A' - 'a')
得到的值为'A'
。此外,ASCII的大写字母排列与小写字母相似,因此'A' + 1
='B', etc. So taking any
char in the lower case alphabet and adding
'A' - 'a'will result in the upper case version of that letter. In ASCII
'一个' - 'a'`碰巧有-32的值。因此,取小写字母的数值,减去32,并得到大写字母的值。
为了比较,这里是不依赖于ASCII的代码版本:
auto l = std::locale();
if (std::islower(name[i], l))
name[i] = std::tolower(name[i], l);