如果我有:
unsigned int x;
x -= x;
Run Code Online (Sandbox Code Playgroud)
很明显,x 应该这样表达后是零,但到处看,他们说的行为,这种代码是不确定的,而不是仅仅值x(直到减法之前).
两个问题:
这段代码的行为确实未定义吗?
(例如,代码在兼容系统上崩溃[或更糟]?)
如果是这样,为什么 C表示行为是未定义的,当非常清楚x这里应该为零时?
即不在此定义行为给出的优势是什么?
很明显,编译器可以简单地使用它在变量中认为"方便"的任何垃圾值,并且它可以按预期工作......这种方法有什么问题?
考虑这个程序:
#include <stdio.h>
int main(void)
{
unsigned int a;
printf("%u %u\n", a^a, a-a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是不确定的行为?
从表面上看,它a是一个未初始化的变量.所以这指向未定义的行为.但是a^a并且a-a等于0所有的价值a,至少我认为是这样的.有可能有某种方式来证明行为是明确定义的吗?
这是Coursera的一个测验(未评分).问题是,以下代码可能评估的内容是什么?正确的答案是127和0(其他选项崩溃,-1,128.为什么以下代码可能评估为0?我理解为什么它会评估为127.它是否就像char字节未初始化一样简单因此随机?还可以评估0到127之间的任何#吗?
int foo(void) {
char bar[128];
char *baz = &bar[0];
baz[127] = 0;
return strlen(baz);
}
Run Code Online (Sandbox Code Playgroud) 摘自李普曼的《C++ Primer》,
当我们定义一个变量时,我们应该给它一个初始值,除非我们确定在该变量用于任何其他目的之前该初始值将被覆盖。如果我们不能保证变量在被读取之前会被重置,我们应该初始化它。
如果在操作中使用未初始化的变量会发生什么?它会崩溃/代码会无法编译吗?
我在互联网上搜索了相同的答案,但有不同的“说法”。因此出现以下问题,
C 和 C++ 标准在处理未初始化变量的方式上是否有所不同?
对于类似的疑问,如何以及在哪里可以找到“官方”答案?对于业余爱好者来说查找 C 和 C++ 标准实用吗?