c - 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 标准规定它们具有“不确定”值,这意味着它们没有任何固定值。从本质上讲,这意味着您的程序已损坏。
在对象已被初始化或已被赋值的程序中,编译器将正确地管理它们的值:如果它需要 的值xno
但处理器寄存器中没有它,编译器将生成一个加载指令以将其带入入一个寄存器。如果它在一个寄存器中,它将使用该寄存器作为 的值xno
。因此,在工作程序中,编译器会生成适当的指令。
您所看到的是,由于xno
从未zno
初始化或分配值,编译器忽略了加载其值的指令。程序不是用从内存中加载的值填充寄存器,而是使用寄存器中先前使用的任何数据来执行。此外,编译器使用的寄存器可能每次都不同xno
或被zno
使用。xno
因此,一个程序可能表现得好像zno
每次使用它们时都使用不同的值。
此外,在某些情况下,C 标准指定使用未初始化的自动对象具有未定义的行为。(当对象的地址从未被获取时,就会发生这种情况。)在这种情况下,C 标准不仅没有指定对象具有什么值,而且根本没有指定程序的行为是什么。
推荐阅读
- angular - 如何以角度动态更改组件名称?
- flutter - Flutter / Dart:在小部件测试中点击AppBar小部件时未调用onPressed
- linux - CondaDependencyError:无法运行求解器。没有可用的 SAT 实施
- node.js - 在 Docker Compose 下将 OpenTelemetry 跟踪信息从我的应用程序获取到 jaeger 时遇到问题
- r - 如何从矩阵中复制一行并将其设置为r中另一个矩阵中的一行?
- postscript - 保存到 postscript 时符号显示不正确
- sql - CTE 与子查询
- sql - 动态调整选择字段 - PostgreSQL
- unreal-engine4 - Unreal 4.25 - 在画布上绘制文本不会刷新
- javascript - 最少的硬币,仅使用条件语句