C 这段代码怎么了

C 这段代码怎么了,c,conditional,conditional-statements,C,Conditional,Conditional Statements,当我编译这段代码时,它每次都给出随机值,我无法理解变量i的效果 #include<stdio.h> int main() { int j,i=-4,num; j=(num<0?0:num*num); printf("%d",j); return 0; } num未初始化。这意味着该值是未定义的、不确定的或随机的。该值可能是该内存位置中剩余的值 我在这个节目中没有任何意义 使用三元条件运算符或条件运算符初始化j。这意味着,如果num

当我编译这段代码时,它每次都给出随机值,我无法理解变量i的效果

 #include<stdio.h>
 int main()
 {
    int j,i=-4,num;
    j=(num<0?0:num*num);
    printf("%d",j);
    return 0;
  }
num未初始化。这意味着该值是未定义的、不确定的或随机的。该值可能是该内存位置中剩余的值

我在这个节目中没有任何意义

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

如果我们写下:

if(num < 0) 
    j = 0;
else 
    j = num * num;
但由于num是随机的,未定义的值j也将是随机的

正如我们看到的,在程序中没有使用i,但仍然会对程序产生影响,我知道num没有初始化,这就是为什么我想知道效果和输出

除了num未初始化并因此导致未定义的行为这一事实之外,任何事情都可能发生,您可以通过分析程序集输出来了解技术方面的情况。然而,这与C规范不同,并且严重依赖于编译器、底层体系结构和所使用的操作系统

我如何影响该计划

它没有被使用,因此编译器甚至可能决定完全忽略它。但是,当使用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)
 --------

尽管如此,我们观察到的一切都只是未定义的行为。

num未初始化,因此每次都会得到未定义的j值。i没有被使用,可以被删除。你没有在任何地方使用变量i,并且说不能理解变量i的效果。+不需要括号,如果它是一个宏定义,首先你在没有i的情况下编译并检查输出。这是我在一本书上找到的一个程序,正如我们看到的,i在程序中没有使用,但仍然会对程序产生影响,我知道num没有初始化,这就是为什么我想知道效果和输出。我想知道条件运算符是如何工作的。我只想知道如果我没有在整个程序中使用i,那么为什么当我删除变量时输出会受到影响。当使用或删除i变量时,输出不会受到影响。也许你认为它会受到影响,因为num和j值总是随机的,即总是不同的。谢谢你的解释
 --------
| 0x0000 |   <= memory location assigned to num (randomly "initialized" to 0x0000 by coincidence)
+--------+
| 0xnnnn |   (Unused)
 --------