【问题标题】:Same variable used in 2 nested loops can have different values?2个嵌套循环中使用的相同变量可以有不同的值?
【发布时间】:2014-12-01 18:56:46
【问题描述】:

首先我想和大家打个招呼!

我是一名自学成才的初级程序员,从 C 开始,并开始真正享受它。

今天我在我的一个测试程序中偶然发现了一些非常有趣和有趣的东西:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUMBERS 6
#define BALLS 6

int main()
{
int x, y, z, numbers[BALLS];

for (x = 0; x < BALLS; x++)
    numbers[x] = -1;

srand((unsigned)time(NULL));

puts("\t\tTHE AMAZING LOTTERY\n\n");
printf("Have you ever won at a lottery?\n");
printf("You can try your luck now! %c\n\n" , 2);
printf("Quick, write down 6 numbers and then press \"Enter\"");
getchar();

for (y = 0; y < BALLS; y++)
{



/* This is the intriguing part*/

printf("%d\n", y);



  label:
    z = rand() % NUMBERS+1;

    for (y = 0; y < BALLS; y++)
    {
        if (z == numbers[y])
            goto label;
        else if (numbers[y] != -1)
            continue;
        else
        {
            numbers[y] = z;
            break;
        }
    }
}
printf("\n\nToday's numbers are %c\a ", 16);
for (x = 0; x < BALLS; x++)
    printf("%d, ", numbers[x]);

printf("\n\n\nWell...\n\t..tough luck buddy..");
printf("\n\n\n\tMaybe next time.. %c" , 15);
putchar('\n');
getchar();

return 0;
}

尝试了 3 种不同的编译器,c4droid、code::blocks 和在线编译器。同样有趣的结果。 为什么同一个变量(y),只声明一次,但在 2 个嵌套循环中使用,可以保存不同的值而不会造成任何问题?

我不认为这是推荐的做法,但是......它是如何工作的?

【问题讨论】:

    标签: variables for-loop int


    【解决方案1】:

    您的代码有点复杂。它不应该像你说的那样工作,除非你在里面定义循环变量,比如“for (int y = 0; ...)”,写一个简单的代码并测试它:

    int i = 0;
    for (i = 0; i < 5; i++) {
            printf("in first loop with i = %d\n",i);
        for (i = 0; i < 2; i++) {
            printf("in second loop with i = %d\n",i);
        }
    }
    

    【讨论】:

    • 进入无限循环的好方法!是的,您的程序可以正常工作,但是如果您尝试编译我的程序,您会发现不知何故大 for 循环会记住它从哪里停止并从那里继续,而不是从小 for 循环结束的地方......虽然它使用相同的确切变量....
    • 你只有 y 在循环语句的左侧,没有其他地方,所以没有其他人改变它。它起作用的唯一原因可能就像在进入内部循环之前恰好在 y 具有值时从内部循环中断一样。放一些 printf 或调试它,看看 y 是如何变化的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多