我正在阅读有关未定义行为的维基百科文章。
在 C 中,在初始化之前使用任何自动变量会产生未定义的行为
但是,这个答案说,字符类型可以。维基百科在这里错了吗?
在 C 中(我不知道 C++),类型unsigned char
是唯一保证所有可能的位表示具有特定值的类型。没有陷阱表示,没有无效值,没有填充位,什么都没有(在其他类型中也可以)。
但是,由于某种原因,制作依赖于未知位模式的程序是一个坏主意。
未定义的行为并不意味着非法,否则您的程序将在此处崩溃。
如果你使用一个未初始化的变量(如果你分配一个原始变量并且不给它赋值,字符类型是一种特殊的原始类型,就会发生这种情况),该值根本无法确定。它可以是任何东西。您可能不会打扰它可以是任何东西的事实,因为例如您可以稍后分配一个值,也许只是在某些情况下。
但是,当您读取变量的值并根据此未初始化的值做出进一步的决定时,这种情况变得严重,例如在以下情况下:
int x;
if (x > 0) {
...
} else {
...
}
这会把你带到这里。
您链接的答案是以下内容非常好:
int x;
if (someCase) {
x = ...
} else {
...
}
// later:
if (someCase) {
// read x
}