C 比较已定义和未定义的变量

C 比较已定义和未定义的变量,c,tree,null,boolean,binary-tree,C,Tree,Null,Boolean,Binary Tree,我制作了一个基本的树结构,如下所示 typedef struct Tree { int val; struct Tree *left, *right; }Tree; 我创建了两棵树,一棵val为16,另一棵没有值。不是空的,只是没有值。树本身为空,但值不为空 当我比较这两个值时,我注意到在不初始化对象时,无论我放置>还是,其初始值都是不确定的C 2018 6.2.4。这意味着,不仅它的值不受控制,而且C源代码没有对值进行确定性设置,而且当多次使用时,该值甚至不是固定的,它的行为

我制作了一个基本的树结构,如下所示

typedef struct Tree {
    int val;
    struct Tree *left, *right;
}Tree;
我创建了两棵树,一棵val为16,另一棵没有值。不是空的,只是没有值。树本身为空,但值不为空


当我比较这两个值时,我注意到在不初始化对象时,无论我放置>还是,其初始值都是不确定的C 2018 6.2.4。这意味着,不仅它的值不受控制,而且C源代码没有对值进行确定性设置,而且当多次使用时,该值甚至不是固定的,它的行为可能就好像每次都有不同的值一样。此外,根据具体情况,使用未初始化的对象也可能有C标准未定义的行为,不仅其值可能是任何东西,而且试图使用该值可能会导致程序崩溃或以其他方式出现错误行为

当使用未初始化对象的值并且该值只是不确定的,而不是未定义的时,编译器可以自由地表现为它有任何值。作为优化的一部分,编译器因此可能会忽略对值的任何实际测试,并根据编译器的选择生成分支代码,就像测试为真或假一样。编译器生成的代码实际上是偶然的,您无法控制。你不能依赖一个总是评估为假的测试


始终初始化对象。

您已经创建了未定义的行为。未定义的行为很有趣,因为无论发生什么,它仍然遵循未定义行为的规则。有时它可能做一件事,有时它可能做另一件事,有时它可能会关掉太阳。@MichaelBianconi:根据问题中的信息,我们只能断定对象的价值是不确定的,而不是行为是未定义的。@eric鉴于文章中缺乏信息,我们无法得出任何结论。请注意,指针不在同一数组中的<具有未定义的behaviour@AnttiHaapala:该对象未被赋予任何值的语句意味着它未被初始化,因此具有不确定值。@您假设OP知道默认初始化和未初始化之间的差异,但不知道是否存在不确定值可以安全地进行比较…或者因为op没有被要求生成mre,可能是另一个已初始化,因此null@AnttiHaapala:问题陈述并强调,对象没有被赋予任何价值。如果没有给它任何值,它就没有初始化初始化,不管是隐式的还是显式的初始化,都会给对象一个值。