【问题标题】:Why the following code printing garbage value? [duplicate]为什么下面的代码打印垃圾值? [复制]
【发布时间】:2020-03-23 07:20:53
【问题描述】:

我不明白为什么下面的代码打印垃圾值

#include <stdio.h> 

void main(){
 int arr[5],i=0;
 while(i<5)
    arr[i]=++i;
for(i=0;i<5;i++)
    printf("%d",arr[i]);
 }

【问题讨论】:

  • 顺便说一句:您应该正确缩进您的代码。可读代码 = 代码更容易调试
  • arr[i]=++i;你真的想这样做吗?

标签: c arrays loops while-loop garbage


【解决方案1】:

声明

arr[i]=++i;

实际上等价于

i = i + 1;
arr[i] = i;

这意味着您不会初始化数组中的第一个元素(位于索引0)。更糟糕的是,您还将在索引5 处写入,这超出范围,将导致未定义的行为

未初始化的局部变量会有一个indeterminate值,可以被视为随机或垃圾。

我建议您也有一个 for 循环,就像用于打印初始化值的循环一样:

for (i = 0; i < 5; ++i)
    arr[i] = i + 1;

【讨论】:

  • 所以当我们首先分配i的值时,它会增加i,然后考虑表达式a[ i ]?
  • 这是未定义的行为。您建议的翻译可能是一种可能性,但不是唯一的一种。但是,它们都很糟糕,因为行为是未定义的。
  • @NemindaPrabhashwara — 不一定,但有可能。
  • 执行通过分号时必须完成增量。何时完成主要取决于编译器。 i 的值在没有插入序列点的情况下被修改和读取;行为未定义。如果机器因此而熔化,那也没关系(不太可能,但允许)。干脆不要这样做。您无法判断结果应该是什么,因为没有定义(必需)的结果。
  • @NemindaPrabhashwara 一般提示:不要在同一语句中使用 xx++ 的构造。不仅代码难以理解,而且在许多情况下你也会得到 undefined行为。阅读:stackoverflow.com/questions/949433/…
【解决方案2】:

arr[i] = ++i 表达式是未定义,因为您同时从 i 读取和写入。

= 不是一个排序点,所以你不能假设i 在获取arr 的索引之前增加了。

即使在获取arr 的索引之前增加了i(因为在某些语言中,例如C++17 需要这样做,那么程序行为仍然是未定义的由于超出范围的数组访问)。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2013-09-04
    • 2016-04-15
    • 2012-07-09
    相关资源
    最近更新 更多