请解释这个代码正在做什么(someChar - 48) [英] Please explain what this code is doing (someChar - 48)
问题描述
我遇到一些练习问题,我看到这段代码:
I'm going through some practice problems, and I saw this code:
#include <stdio.h>
#include <string.h>
int main(void) {
char* s = "357";
int sum = 0;
int i = 0;
for (i = 0; i < strlen(s); i++) {
sum += s[i] - 48;
}
printf("Sum is %d", sum);
return 0;
}
/ p>
Can someone explain what the code does, especially the subtraction with 48 part?
推荐答案
代码基本上总和表示为字符串的数字的数字。它使两个重要的假设正常工作:
The code basically sums the digits of a number represented as a string. It makes two important assumptions to work properly:
- 字符串只包含
'0'中的字符' 9'
范围 - 使用的字符编码是ASCII
在ASCII中,'0'== 48
,'1'== 49
等等。因此,'0' - 48 == 0
,'1' - 48 == 1
等等。也就是说,减去48将 char
值'0'..'9'
转换为 int
value 0..9
。
In ASCII, '0' == 48
, '1' == 49
, and so on. Thus, '0' - 48 == 0
, '1' - 48 == 1
, and so on. That is, subtracting by 48 translates the char
values '0'..'9'
to the int
values 0..9
.
因此,正是因为'0'== 48
,代码也可以使用:
Thus, precisely because '0' == 48
, the code will also work with:
sum += s[i] - '0';
此版本的意图可能略微更清楚。
The intention is perhaps slightly more clear in this version.
您当然可以通过添加进行反向映射,例如 5 +'0'=='5'
。同样,如果您在'A'..'Z'
范围内包含一个字母 char
,则可以减去'A'
,以获取 0..25
范围内该字母的索引。
You can of course do the "reverse" mapping by addition, e.g. 5 + '0' == '5'
. Similarly, if you have a char
containing a letter in 'A'..'Z'
range, you can "subtract" 'A'
from it to get the index of that letter in the 0..25
range.
- Wikipedia/Digit sum
- Wikipedia/ASCII
- How to convert a single char into an int
- Language showdown: Convert string of digits to array of integers?
- Many examples of this digit conversion, using subtraction with both
'0'
and48
!
如上所述,原始的
- 48
代码假定这个特征使用r编码是ASCII。- '0'
不仅提高了可读性,而且还放弃了ASCII假设,并且将与任何编码一起使用,如C语言所指定的规定数字字符必须在连续块中顺序编码。As mentioned, the original
- 48
code assumes that the character encoding used is ASCII.- '0'
not only improves readability, but also waives the ASCII assumption, and will work with any encoding, as specified by the C language which stipulates that digit characters must be encoded sequentially in a contiguous block.另一方面,没有关于字母的规定。因此,在您使用EBCDIC编码的罕见情况下,例如,将
'A'..'Z'
映射到0..25
不再像简单的减去'A'
,因为字母是 NOT EBCDIC中的连续块。On the other hand, no such stipulation is made about letters. Thus, in the rare situation where you're using EBCDIC encoding, for example, mapping
'A'..'Z'
to0..25
is no longer as simple as subtracting'A'
, due to the fact that letters are NOT encoded sequentially in a contiguous block in EBCDIC.某些编程语言通过强制使用一个特定的编码来简化问题,用于表示源代码(例如Java使用Unicode: JLS§3.1)
Some programming languages simplify matters by mandating one particular encoding is used to represent the source code (e.g. Java uses Unicode: JLS §3.1)
- Wikipedia/Extended Binary Coded Decimal Interchange Code (EBCDIC)
- Are digits represented in sequence in all text encodings?
这篇关于请解释这个代码正在做什么(someChar - 48)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- Many examples of this digit conversion, using subtraction with both