Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在循环中声明变量,但在c中不初始化_C_Gcc - Fatal编程技术网

在循环中声明变量,但在c中不初始化

在循环中声明变量,但在c中不初始化,c,gcc,C,Gcc,我正在练习C编程技巧,找到一些已经存在的技巧,并找出答案。 我的实践项目之一是在循环中声明一个变量,但不进行初始化。我有如下代码 #include<stdio.h> int main() { for(int i = 1; i <= 10; i++) { int a; int b = 0; printf("i=%d, a=%d, b=%d\n", i, a++, b++); } }

我正在练习C编程技巧,找到一些已经存在的技巧,并找出答案。 我的实践项目之一是在循环中声明一个变量,但不进行初始化。我有如下代码

#include<stdio.h>


int main()
{
    for(int i = 1; i <= 10; i++)
    {
        int a;
        int b = 0;
        printf("i=%d, a=%d, b=%d\n", i, a++, b++);
    }
}
输出与预期一样,因为
a
没有给出明确的值,这意味着程序将在每个循环中重用以前的值。从语义上讲,我们想使用一个新的
a
,但是引擎盖下的逻辑已经被修改了。因此,我将其归咎于GCC优化级别,并试图证明这一点

但是,我将GCC优化级别从O0-O3更改为Og(当设置为Og时,
a
的值以random开头),结果根本没有改变

我知道如果给
a
一个精确的值,程序就会按预期运行

没有出路吗?如果是这样的话,那真的很令人困惑

输出与预期一样,因为
a
没有给出明确的值,这意味着程序将在每个循环中重用以前的值

这并不意味着,也没有预期的产出

根据C标准,未初始化对象的值是不确定的1,这意味着不仅没有指定它的值,而且程序可能会表现为没有任何固定值。2如果在其生命周期内多次使用,程序可能会表现为每次都有不同的值。例如,C标准允许
printf(“%d%d%d\n”,a,a,a)以打印“34-10200773 2147483204”。
a
的值也可以是陷阱值,如果它的类型在特定的C实现中有这样的值

此外,使用具有自动存储持续时间且未获取其地址的未初始化对象的值是显式的未定义行为。3

您得到的输出仅仅是编译器工作方式的偶然。它不是设计行为,可能因编译器版本而异,具体取决于环境。编译器在优化过程中可以很容易地删除
++
,因为这是
A
在其生命周期内的最后一次操作(在执行完定义的块时结束),这意味着该值在之后不会使用,因此增量没有定义的效果。那么,您可能已经看到迭代之间的输出没有变化

另一种可能性是该值可能不是从零开始的

另一种可能性是编译器可能使用了
a
的某个处理器寄存器而不是内存,并且由于
a
未初始化,第二次和后续迭代的输出将是该寄存器中碰巧留下的任何
printf

脚注 1 C 2018 6.2.4 6,关于无可变长度数组类型的自动存储持续时间的对象:“对象的初始值不确定。”

2 C 2018 3.19.2,“不确定值”:“未指定值或陷阱表示”。3.19.3,“未指定值”:“本文件未对任何情况下选择的值提出要求的相关类型的有效值”

3 C 2018 6.3.2.1 2,关于将左值转换为值:“如果左值指定了一个自动存储持续时间的对象,该对象可以用
寄存器
存储类声明(从未获取过其地址),并且该对象未初始化(未使用初始值设定项声明,且在使用前未对其执行赋值),行为未定义。“

我的练习项目是在循环中声明一个变量,但不进行初始化

在表达式中使用未初始化的变量是一种不好的做法,我们无法预测结果,不要依赖它,即使每次运行时都得到相同的输出

输出与预期的一样,因为没有给a一个显式值,这意味着程序将在每个循环中重用以前的值

这只是一个未定义的行为,您的程序的行为就像我们声明的一样

int a;

作为
static int a;

但是,如果程序大小增加或
inta
的位置改变,我不确定它的行为是否相同


你似乎知道如何正确使用它(使用前初始化),所以就这样使用它。

使用
gcc-Wall-Wextra-g
编译,然后使用。Read
没有出路吗?如果是这样,那真的很混乱。
。我也很困惑。“出路”from?我想这是XY问题。你想得到一个随机数吗?
我的一个练习项目是在循环中声明一个变量,但没有初始化
更让我困惑-练习无效的错误代码只会让你成为一个糟糕的程序员。相反,我建议你坚持用可预测的定义编写正确的代码ed behavior.
语义上,我们想使用一个新的a
“使用”where和how?它是什么意思“fresh”?很抱歉,我的意思是,在不修改代码的情况下使a和B的输出保持一致?使用什么?根据什么规则?如何度量“一致性”?输出与C语言一致-值未初始化,它可能有任何值,也可能有任何值。我已经知道这是一个无效的错误代码。也许我描述的一些词有点不合适,但它不会妨碍我找出所有这些陷阱。你所做的是什么,但没有说明原因是的。别再指手画脚了,告诉我引擎盖下面发生了什么。
i=1, a=0, b=0
i=2, a=1, b=0
i=3, a=2, b=0
i=4, a=3, b=0
i=5, a=4, b=0
i=6, a=5, b=0
i=7, a=6, b=0
i=8, a=7, b=0
i=9, a=8, b=0
i=10, a=9, b=0