已关闭,此问题为opinion-based。它目前不接受回答。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。
2个月前关闭。
Improve this question
我对C和编程都是新手,我试着这样做一个for循环:
int main(void)
{
int y;
scanf ("%d", &y);
int x = 0;
for (; y > 0; x++)
{
y = y / 10;
}
printf ("x = %d\n", x);
printf ("y = %d\n", y);
}
我想知道什么是最好的方法,在循环结束后,不改变y的值。
我做了这样的事情:
int main(void)
{
int y;
scanf ("%d", &y);
int x = 0;
for (int y1 = y; y1 > 0; x++)
{
y1 = y1 / 10;
}
printf ("x = %d\n", x);
printf ("y = %d\n", y);
}
这给了我想要的结果,但我想知道是否有更正确的方法来做这件事。
3条答案
按热度按时间dxxyhpgq1#
有一个循环变量不仅是正确的,这是通常的情况。
如果我们把
y1
看作是一个循环变量,那么把循环写成下面这样会更有意义:作为替代方案,您可以使用
我不确定这是否总是给予准确的结果,因为它可能会受到浮点错误的影响。您可以使用
请注意,与OP的代码一样,这两种解决方案都不处理负输入。
注意OP的代码返回
0
的0
,所以这个答案中的代码片段也是这样做的。eblbsuwk2#
如果有很好的理由在循环内部使用与外部相同的名称,也许是因为名称和正在进行的工作之间存在强关联,您可以复制值并使用临时变量隐藏先前的名称:
这将使用
ty
将内部y
初始化为外部y
的值,然后循环将只使用内部y
。这不是你应该经常做的事情。
jgzswidk3#
一般的最佳实践是始终保持
for
循环尽可能简单,这意味着使它们尽可能接近惯用的for(int i=0; i<n; i++)
。我们越是偏离这种形式,它就越难阅读,潜在的bug也就越多。此外,由于额外的分支、缓存未命中等,复杂循环往往比简单循环运行得慢得多。保持简单意味着:不要发明多个循环迭代器,不要有不必要的复杂循环条件,不要以奇怪的方式或方向迭代,不要用逗号运算符的“创造性”使用来混乱代码,不要从循环体内部更改循环迭代器,不要从多个位置退出循环。等
在这种情况下,循环似乎只有一个目的:计算十进制数位的数量。知道一个32位的int最多有10位数意味着我们可以硬编码一个循环条件,比如
i < 10
,但这有点奇怪,也是不可移植的,我们有y1 > 0
条件。因此,循环将简单地变为:
保持它尽可能简单和可读。事实证明,这几乎是你开始已经有了的代码。