0

我让程序按预期工作,但谁能解释它是如何工作的?

#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 感谢你们的快速回复,爱你们。我想到了。

4

5 回答 5

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&&这样的,但没必要那么混乱。)

于 2013-01-24T22:13:17.307 回答
2

我从您评论中的编辑中假设您想知道如何将其[]应用于string对象。运算符[]重载用于string返回对表示字符串的指定位置偏移处的字符的引用。不需要将 直接转换为string数组。实现重载的代码很可能是遍历链表。这取决于如何string实施。

于 2013-01-24T22:25:00.427 回答
1

它假定 ASCII 字符格式从小写转换为大写,您从原始 ASCII 值中减去 32。这是因为大写的 ASCII 值小于小写的 ASCII 值,并且它是和之间的恒定差异,A依此类推。aBb

供参考:http ://www.asciitable.com/

于 2013-01-24T22:11:57.113 回答
1
'a' <= name[i] && name[i] <= 'z'

这一行正在比较这两个字符的相应 ASCII 值。'a'在 ASCII 中是 97 和'z'122。如果name[i]是从'a''z'表达式的字符之一,则返回 true。这通常用于检查变量是否为字母。

于 2013-01-24T22:22:38.550 回答
0
if ('a' <= name[i] && name[i] <= 'z')

char对象是类似于整数的数值。因此'a' <= name[i],只需测试 的数值'a'是否小于或等于您正在检查的字符。结合name[i] <= 'z'和 您正在测试 的数值name[i]是否介于 和 的值'a'之间'z'。现在,最常见的为chars 分配数值的方案,称为“美国信息交换标准代码”(ASCII),是按顺序排列的字母表。'a' + 1 = 'b', 'b' + 1 = 'c', 等等。因此,确定字符是否介于两者之间'a''z'告诉您它是否是小写字母。

name[i] = char(((int)name[i]) - 32);

一旦您知道chars 只是数值,您就可以从我们在小学时学到的算术的基本属性推断出'a' + ('A' - 'a')'A'。此外,ASCII 具有与小写字母类似的大写字母排列,因此'A' + 1= 'B' , etc. So taking anychar in the lower case alphabet and adding'A' - 'a' will result in the upper case version of that letter. In ASCII'A' - 'a'` 恰好具有值 -32。因此,取小写字母的数值,减去 32,得到大写字母的数值。

为了比较,这里有一个不依赖于 ASCII 的代码版本:

auto l = std::locale();

if (std::islower(name[i], l))
    name[i] = std::tolower(name[i], l);
于 2013-01-24T22:48:07.350 回答