我是一个新手程序员,作为教程的一部分,我一直在开发ROT13实现,并遇到了以下代码。它输出正确的字符,但是我不太确定它是如何工作的,也没有附加的解释。
char rot13[] = { 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z','A','B','C','D','E','F','G','H','I','J','K','L','M' };
std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i = 0; i < alphabet.length(); i++) {
std::cout << rot13[alphabet[i] - 'A'];
}具体地说,我不太明白从字符串字母表中的字符减去'A‘如何提供我们的ROT13编号。我最初认为'A‘对应于rot13[]中的一个索引,减去它将为我们提供一个新的索引,但是这不会表明A的索引(Z,Y,X...)下的任何数字。会变成负索引,并抛出错误。
有人能给我解释一下这段代码背后的逻辑吗?
发布于 2018-08-13 04:39:08
假设alphabet[i]是一个大写字母(示例中就是这种情况),alphabet[i] - 'A'将计算到ASCII表中字母'A‘的距离。因此,'A'-'A'将为0,'B'-'A'将为1,依此类推,直到'Z'-'A'为25。
字符数组rot13的写法是这样的:索引0包含字母'N',索引1包含字母'O',依此类推,直到包含字母'Z'的索引12,然后索引13是'A',索引14是'B',依此类推,直到索引25,即'M'
为了让事情更清楚,让我们重写这一行:
std::cout << rot13[alphabet[i] - 'A'];作为:
char letterBeforeRot13 = alphabet[i];
int index = letterBeforeRot13 - 'A';
char letterAfterRot13 = rot13[index];
std::cout << letterAfterRot13;这几乎就是你的编译器所做的,但有更多的细节。
如果我们选择一个示例,其中alphabet[i]等于字母'A',letterBeforeRot13被分配给字母'A',index被分配给'A'-'A',它是0,letterAfterRot13被分配给索引0处的数组rot13的元素,即'N'。因此,字母'A'被转换为'N'。
您可以对任何字母执行相同的操作,您将看到一切都很好,包括当您认为事情会越界时的边缘情况。使用此技术时,您不能使用负索引。
https://stackoverflow.com/questions/51812528
复制相似问题