试图了解这个字符串到整数函数的工作原理
我一直在想如何将输入的字符串转换为整数。我发现这个功能的在线代码:试图了解这个字符串到整数函数的工作原理
int toString(char a[]) {
int c, sign, offset, n;
if (a[0] == '-') { // Handle negative integers
sign = -1;
}
if (sign == -1) { // Set starting position to convert
offset = 1;
}
else {
offset = 0;
}
n = 0;
for (c = offset; a[c] != '\0'; c++) {
n = n * 10 + a[c] - '0';
}
if (sign == -1) {
n = -n;
}
return n;
}
链接here 代码工作,但我不明白为什么。具体来说,我不明白这部分是如何工作的:
n = 0;
for (c = offset; a[c] != '\0'; c++) {
n = n * 10 + a[c] - '0';
}
如果n = 0,乘以10会如何影响结果?另外,如果限制因子是[c]!='\ 0',for循环如何结束?一个[c]如何等于零?
任何帮助将不胜感激
在第一迭代n等于0时,一次迭代后N个相等的[C]的值。参见Horner计划来了解它在数学上的工作原理。 -'0'在这里将结果转换为整数。
“\ 0”是字符串的终止符和乘法* 10来计算的数十,数百等正确的值...
代码工作[...]
不,因为sign
未初始化,但在字符串未以-
开头时使用。技术上,代码有未定义的行为。
请忘记那个网站;它质量低下,不会教你适当的C编程。例如。这些都是由铛产生的警告:
$ cc -c -Wall x.c
x.c:4:7: warning: variable 'sign' is used uninitialized whenever 'if' condition is false
[-Wsometimes-uninitialized]
if (a[0] == '-') { // Handle negative integers
^~~~~~~~~~~
x.c:8:7: note: uninitialized use occurs here
if (sign == -1) { // Set starting position to convert
^~~~
x.c:4:3: note: remove the 'if' if its condition is always true
if (a[0] == '-') { // Handle negative integers
^~~~~~~~~~~~~~~~~
x.c:2:14: note: initialize the variable 'sign' to silence this warning
int c, sign, offset, n;
^
= 0
1 warning generated.
任何站点自称教授C必须使用游离的警告的例子(除非代码的点是展示错误)。
你是否意识到函数名称toString
有反向?它应该是fromString
或toInteger
。这是该网站的一些糟糕的质量保证。
不@Jens你有警告但这部分不是UB。他检查一个特定的值。符号具有任何其他值(并且这是未初始化的局部变量的问题),代码以绝对定义的方式运行。 –
@ PeterJ_01然后你对未定义行为的理解与C标准阐明的不同:* C99#J.2未定义行为*,具有自动存储持续时间的对象的值在不确定时使用(6.2 .4,6.7.8,6.8)。 – Jens
这不是教程服务。如果您自己编写代码时遇到困难,请将其发布并解释发生了什么问题。 –
n最初只有0,此后一旦添加了'a [c] - '0',它将会改变,然后可能会受到后面乘法的影响。 – Annabelle
提示:乘以10与后续迭代有关。显然,不是第一个。 –