首页 > 解决方案 > c 编程中长数据类型的默认值

问题描述

我正在尝试添加两个具有默认值的长变量。但是其中一个变量被赋值为 1。但据我所知,它应该被赋值为 0。为什么会这样?

#include <stdio.h>

long add(long, long);

main()
{
    long xno;
    long zno;
    long sum;

    printf("xno = %d, zno = %d \n", xno, zno);

    sum = add(xno, zno);

    printf("sum = %d", sum);
}

long add(long x, long y) {
    printf("x = %d, y = %d \n", x, y);
   return x + y;
}

result: 
xno = 0, zno = 1
x = 0, y = 1
sum = 1

结果

标签: c

解决方案


默认情况下不初始化具有自动存储持续时间的对象。C 标准规定它们具有“不确定”值,这意味着它们没有任何固定值。从本质上讲,这意味着您的程序已损坏。

在对象已被初始化或已被赋值的程序中,编译器将正确地管理它们的值:如果它需要 的​​值xno但处理器寄存器中没有它,编译器将生成一个加载指令以将其带入入一个寄存器。如果它在一个寄存器中,它将使用该寄存器作为 的值xno。因此,在工作程序中,编译器会生成适当的指令。

您所看到的是,由于xno从未zno初始化或分配值,编译器忽略了加载其值的指令。程序不是用从内存中加载的值填充寄存器,而是使用寄存器中先前使用的任何数据来执行。此外,编译器使用的寄存器可能每次都不同xno或被zno使用。xno因此,一个程序可能表现得好像zno每次使用它们时都使用不同的值。

此外,在某些情况下,C 标准指定使用未初始化的自动对象具有未定义的行为。(当对象的地址从未被获取时,就会发生这种情况。)在这种情况下,C 标准不仅没有指定对象具有什么值,而且根本没有指定程序的行为是什么。


推荐阅读