繁体   English   中英

内部增量i ++输出不变的结果

[英]inner increment i++ output unchanged result

我正在阅读《 C Primer Plus》这本书,并遇到了如下代码片段:

int main()
{
    int x = 30;

    printf("x in outer block: %d at %p\n", x, &x);
    {
        int x = 77; // new x , hides first x
        printf("x in inner block: %d at %p\n", x, &x);
    }
    printf("x in outer block: %d at %p\n", x, &x);
    while (x++ < 33) //original x
    {
        int x = 100;
        x++;
        printf("x in while loop: %d at %p\n", x, &x);
    }
    printf("x in outer block: %d at %p\n", x, &x);

    return 0;
}

它输出:

In [23]: !./a.out
x in outer block: 30 at 0x7ffee7243788
x in inner block: 77 at 0x7ffee7243784
x in outer block: 30 at 0x7ffee7243788
x in while loop: 101 at 0x7ffee7243780
x in while loop: 101 at 0x7ffee7243780
x in while loop: 101 at 0x7ffee7243780
x in outer block: 34 at 0x7ffee7243788

这让我很困惑

x in while loop: 101 at 0x7ffee7243780
x in while loop: 101 at 0x7ffee7243780
x in while loop: 101 at 0x7ffee7243780

我如何使其输出?

x in while loop: 101 at 0x7ffee7243780
x in while loop: 102 at 0x7ffee7243780
x in while loop: 103 at 0x7ffee7243780

发生这种情况的原因是,在while循环范围内,每次执行将变量x重新定义为等于100,这将x定义在外部,因此您不会将其递增3倍,而是将其递增3倍。 在每个新的迭代中, 新的 x都会增加1,您会在输出中看到101。

每次进入while循环时,将内部x值重置为100,您可以添加一个外部var,然后在while循环中将其递增,将其值添加到100。

int main()
{
    int x = 30;
    int y = 0;
    printf("x in outer block: %d at \n", x);
    {
        int x = 77; /* new x , hides first x*/
        printf("x in inner block: %d at \n", x);
    }
    printf("x in outer block: %d at\n", x);

    while (x++ < 33) /*original x*/
    {
        int x = 100;/*value resets on every entry to 100*/
        x++;
        x +=y;
        ++y;/*value is incremented on every entry */

        printf("x in while loop: %d at\n", x);
    }
    printf("x in outer block: %d at \n", x);
    return 0;
}

这里有很多解释,所以

让我直接回答您的问题“ 如何输出?

while (x++ < 33) //original x
{
    //int x = 100;
    static int x = 100;
    x++;
    printf("x in while loop: %d at %p\n", x, &x);
}

我会说一些关于static变量和一般storage classes

在此while循环中:

while (x++ < 33) //original x
{
    int x = 100; // this x hides the original x
    x++;
    printf("x in while loop: %d at %p\n", x, &x);
}

在循环体中声明的x隐藏原始x (在while循环表达式中用作计数器)。 while循环的每次迭代中while您都将获得内部x相同值101 ,因为while循环的每次迭代都会创建x新实例(内部x ),并使用值100初始化,并在循环主体的末尾销毁' x

我如何使其输出?

如果希望内部x的最后一个值在while循环的每次迭代中都保持不变,则可以简单地将其设为静态:

while (x++ < 33) //original x
{
    static int x = 100;
    x++;
    printf("x in while loop: %d at %p\n", x, &x);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM