【问题标题】:What is happening with this code [closed]这段代码发生了什么[关闭]
【发布时间】:2014-11-12 10:43:11
【问题描述】:

当我编译这段代码时,它每次都给出随机值,我无法理解变量“i”的影响?

 #include<stdio.h>
 int main()
 {
    int j,i=-4,num;
    j=(num<0?0:num*num);
    printf("%d",j);
    return 0;
  }

【问题讨论】:

  • num 未初始化,因此您每次都会得到未定义的 j 值。 i 未使用,可以删除。
  • 你没有在任何地方使用变量i,并且说“无法理解变量i的影响。”
  • + 不用括号,如果是宏定义就可以了
  • 首先你编译没有“i”并检查输出
  • 这是我在一本书上找到的一个程序,正如我们所见,程序中没有使用“i”但仍然对程序有影响,而且我知道 num 没有初始化这就是为什么我想知道效果和输出

标签: c conditional conditional-statements


【解决方案1】:

num未初始化。这意味着 valueundefinedindeterminaterandom。该值可能是该内存位置中剩余的值。

i在这个程序中没有意义

j 使用三元条件条件运算符进行初始化。这意味着如果num &lt; 0 则值为0,如果num &lt; 0 则值为num * num

如果我们这样写,也许你会更容易:

if(num < 0) 
    j = 0;
else 
    j = num * num;

但由于num 是随机(未定义)值,j 也将是随机的。

【讨论】:

  • 我知道条件运算符是如何工作的。我只想知道我是否没有在整个程序中使用 i 那么为什么当我删除变量 i 时输出会受到影响
  • 使用或删除i 变量时,输出不会受到影响。也许你认为它受到了影响,因为 numj 值总是随机的,即总是不同的。
【解决方案2】:

正如我们所见,程序中没有使用“i”,但仍然对程序有影响,而且我知道 num 没有初始化,这就是我想知道效果和输出的原因

除了num 未初始化并因此导致未定义的行为(意味着任何事情都可能发生)这一事实之外,您还可以通过分析汇编输出来了解技术方面。然而,这超出了 C 规范,很大程度上取决于编译器、底层架构和您使用的操作系统。

  • i 对程序有何影响?

    它没有被使用,因此编译器甚至可能决定完全忽略它。但是,当使用gcc 编译代码而不进行优化时,我们看到这会在代码中添加一条指令:

    movl    $-4, -12(%rbp)
    

    因此,有两个影响:由于增加了指令,生成的目标代码会稍微变大,程序的运行时间会稍微增加。如果您使用不同的优化级别,这可能会完全不同。

  • Num 没有初始化所以我想知道效果和输出

    对于自动变量,仅分配空间(在堆栈上),但未初始化。由于之前可能使用过相同的内存位置(堆栈),因此这些位置可能包含任何内容。所以,输出取决于之前发生的事情,这是不确定的。由于j是根据num计算的,所以j的内容也是未定义的。

  • 为什么当我删除变量 i 时输出会受到影响

    删除变量 i 可能会影响堆栈上的空间分配(因为需要更少的空间),并可能导致 num 重用可能包含一个常量值而不是随机值的不同内存位置价值。然而,这仍然是未定义的,并且随着编译器、架构和平台的变化而变化,并且取决于之前发生的事情。

    i 的可能堆栈布局,偶然第一个单词总是包含 0x0000 而第二个单词对于每个程序调用都不同:

     --------
    | 0x0000 |   <= memory location assigned to i (will be initialized to -4 in the next step)
    +--------+
    | 0xnnnn |   <= memory location assigned to num (contains a random value)
     --------
    

    没有i的可能堆栈布局:

     --------
    | 0x0000 |   <= memory location assigned to num (randomly "initialized" to 0x0000 by coincidence)
    +--------+
    | 0xnnnn |   (Unused)
     --------
    

不过,我们观察到的一切都只是未定义的行为

【讨论】:

  • 感谢您的解释
猜你喜欢
  • 2014-03-20
  • 2016-06-09
  • 2018-07-28
  • 1970-01-01
  • 2013-01-24
  • 2012-08-29
  • 2012-07-26
  • 2014-09-28
相关资源
最近更新 更多