如何在传递语句参数之前初始化变量会影响输出?

时间:2017-02-08 03:35:08

标签: c

#include <stdio.h>

int main()
{
    int a, b, sum;
    sum = a + b; // initializing variable "sum" here gives incorrect answer to a+b
    printf("Enter value a: ");
    scanf("%d", &a);
    printf("Enter value b: ");
    scanf("%d", &b);

    printf("sum of %d + %d = %d\n\n", a, b, c);
    return 0;
}

这是一个应该对两个整数求和的程序。 我注意到,当我在打印和扫描语句中传递任何参数之前初始化变量“sum”时,我的输出不是变量“a”和“b”的正确总和。但是当我在print和scan语句之后初始化变量“sum”时输出是正确的:

#include <stdio.h>

int main()
{
    int a, b, sum;
    printf("Enter value a: ");
    scanf("%d", &a);
    printf("Enter value b: ");
    scanf("%d", &b);
    sum = a + b; // variable "sum" is initialized after statement arguments
    printf("sum of %d + %d = %d\n\n", a, b, c);
    return 0;
}

所以我的问题是:

  1. 为什么需要在语句参数后初始化变量?
  2. 变量声明和初始化顺序背后的实际逻辑是什么?

2 个答案:

答案 0 :(得分:3)

首先,变量&#39; c&#39;从未声明过,编译器正在给出错误。修改你的代码。

至于&#39;总和&#39;变量:问题不是初始化,而是评估。 在C 表达评估的顺序被称为&#39; applicative &#39; order,表示所有内部表达式都必须在外部表达式之前进行评估。

在你的情况下,矿工是:我们需要分配&#39;总和&#39;因此,必须对其进行评估!调用加法运算符(&#39; +&#39;)。但是还有另外两个变量&#39; a&#39;而且&#39; b&#39;。但是,他们没有存储任何值。他们尚未初始化!意图从未初始化的varialbe获取数据的结果是未知的(称为未定义的行为)。

如果您将数据读取到&#39; a&#39;和&#39; b&#39;变量在赋值表达式调用之前,同样的评估结果会导致正确答案,因为&#39; a&#39;和&#39; b&#39;存储一些定义的数字。

所以... 在用C语言写作时,你应该始终牢记评估的顺序是适用的。如果您开始使用副作用,这一点非常重要。此外,函数参数的评估顺序是不确定的。

答案 1 :(得分:2)

在你的第一个代码中,你刚刚声明了int变量a和b并且没有用任何特定的值初始化它们因此它们基本上包含Garbage值,你立即将它们添加到sum变量中,它现在将包含垃圾值。在此之后你正在输入a和b,但你将它们添加到sum变量中,因此sum具有垃圾值,并且你带来了新的变量c,它未被声明,这将在编译时抛出错误

在您的第二个代码中,您声明了a和b,然后扫描它们并将输入值放入a和b并将这些新值添加到sum中,但仍然打印未声明的c值。如果你写

  printf("sum of %d + %d = %d\n\n",a,b,sum);

而不是

 printf("sum of %d + %d = %d\n\n",a,b,c);

您现在可以看到输出。第一个代码打印垃圾值,第二个打印实际总和

为什么需要在语句参数后初始化变量?

如果你没有默认使用某些值初始化它们,它们将保留一些垃圾值,并且对垃圾值进行操作是没用的。在初始化它们的地方并不重要,这取决于你的代码的功能。我也可以用int a = 5;这是在陈述之前。为了避免这种情况,要么在声明它们时进行初始化,要么接受输入并为它们赋值,这样它们就不会持有垃圾值。

变量声明和初始化顺序背后的实际逻辑是什么?

以上解释说明了自己。