C语言 如何在for循环中使用修改后的变量值,而不修改循环外的实际变量?[已关闭]

w46czmvw  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(135)

已关闭,此问题为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);
}

这给了我想要的结果,但我想知道是否有更正确的方法来做这件事。

dxxyhpgq

dxxyhpgq1#

有一个循环变量不仅是正确的,这是通常的情况。
如果我们把y1看作是一个循环变量,那么把循环写成下面这样会更有意义:

int x = 0;
for ( int y1 = y;  y1 > 0;  y1 /= 10 )
   ++x;

作为替代方案,您可以使用

#include <math.h>    // -lm needed by linker.

int x = y  ?  log10( y ) + 1  :  0;

我不确定这是否总是给予准确的结果,因为它可能会受到浮点错误的影响。您可以使用

#include <math.h>    // -lm needed by linker.

int x = y  ?  log10( y + 0.5 ) + 1  :  0;

请注意,与OP的代码一样,这两种解决方案都不处理负输入。
注意OP的代码返回00,所以这个答案中的代码片段也是这样做的。

eblbsuwk

eblbsuwk2#

如果有很好的理由在循环内部使用与外部相同的名称,也许是因为名称和正在进行的工作之间存在强关联,您可以复制值并使用临时变量隐藏先前的名称:

for (int ty = y, y = ty; 0 < y; y /= 10)
    ++x;

这将使用ty将内部y初始化为外部y的值,然后循环将只使用内部y
这不是你应该经常做的事情。

jgzswidk

jgzswidk3#

一般的最佳实践是始终保持for循环尽可能简单,这意味着使它们尽可能接近惯用的for(int i=0; i<n; i++)。我们越是偏离这种形式,它就越难阅读,潜在的bug也就越多。此外,由于额外的分支、缓存未命中等,复杂循环往往比简单循环运行得慢得多。
保持简单意味着:不要发明多个循环迭代器,不要有不必要的复杂循环条件,不要以奇怪的方式或方向迭代,不要用逗号运算符的“创造性”使用来混乱代码,不要从循环体内部更改循环迭代器,不要从多个位置退出循环。等
在这种情况下,循环似乎只有一个目的:计算十进制数位的数量。知道一个32位的int最多有10位数意味着我们可以硬编码一个循环条件,比如i < 10,但这有点奇怪,也是不可移植的,我们有y1 > 0条件。
因此,循环将简单地变为:

int y1 = y;      // y1 temporary variable not to change the value of y
int i;           // declare this outside loop since we need to store the value for later

for(i=0; y1 > 0; i++)
{
  y1 /= 10;
}

保持它尽可能简单和可读。事实证明,这几乎是你开始已经有了的代码。

相关问题