为什么我得到垃圾值?

Why am I getting garbage values?

我正在尝试进行一些基本的数字递增,但我得到了一些奇怪的垃圾值。 (这适用于 C# 但不适用于 C)。有人能告诉我为什么这不起作用吗?

while (1)
{
      int command = 0;

      printf ("Action: ");
      scanf ("%d", &command);


      int countX, countY, countZ = 0;
      if (command == 1)
    {
      countX++;
    }
      if (command == 2)
    {
      countY++;
    }
      if (command == 3)
    {
      countZ++;
    }
      if (command == 0)
    {
      printf ("x: %d, y: %d, z: %d", countX, countY, countZ);
    }

}

这个:

int countX, countY, countZ = 0;

仅初始化 countZ 并保留 countXcountY 未初始化。你想要:

int countX = 0, countY = 0, countZ = 0;

如果 command 等于 0 那么您正在尝试输出具有不确定值的未初始​​化变量 countXcountY

你应该在它们的声明中初始化它们,比如

int countX = 0, countY = 0, countZ = 0;

以及这些陈述

countX++;

countY++;

由于变量未初始化,同样的原因也有未定义的行为。

请注意,您可以使用 switch 语句代替 if 语句。

例如

switch ( command )
{
case 1:
    countX++;
    break;

case 2:
    countY++;
    break;

case 3:
    countZ++;
    break;
}

printf ("x: %d, y: %d, z: %d\n", countX, countY, countZ);

或者你也可以通过以下方式引入枚举

enum { X = 1, Y = 2, Z = 3 }; 
switch ( command )
{
case X:
    countX++;
    break;

case Y:
    countY++;
    break;

case Z:
    countZ++;
    break;
}

printf ("x: %d, y: %d, z: %d\n", countX, countY, countZ);

或以下方式

while ( 1 )
{
    enum { X = 1, Y = 2, Z = 3 }; 
    int countX = 0, countY = 0, countZ = 0;
    int exit_loop = 0;

    int command = 0;

    printf ( "Action: " );
    scanf ( "%d", &command );

    switch ( command )
    {
    case X:
        countX++;
        break;
    
    case Y:
        countY++;
        break;
    
    case Z:
        countZ++;
        break;

    default:
        exit_loop = 1;
        break; 
    }
    
    if ( exit_loop )
    {
        break;
    }
    else
    {
        printf ("x: %d, y: %d, z: %d\n", countX, countY, countZ);
    }
}