我在cppreference.com上看到了下面的示例
int x; // OK: the value of x is indeterminate
int y = x; // undefined behavior
在这里,int y = x;
是未定义的行为,因为x
未初始化。
但,
unsigned char c; // OK: the value of c is indeterminate
unsigned char d = c; // OK: the value of d is indeterminate
这里,unsigned char d = c;
是不确定行为,但unsigned char c;
也是一个未初始化的变量。
那么,为什么unsigned char d
indeterminate?的值是?
发布于 2017-08-04 04:44:02
像cppreference.com这样的在线参考资料在某种程度上是很好的。但众所周知,有时错误或错误解释有时会溜走。因此,在处理这些奇怪的问题时,使用正式的C++标准总是一件好事。
N3936 §8.5初始化器dcl.init 12 ..。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有一个不定值,如果不对该对象执行初始化,则该对象保留一个不确定值,直到该值被替换(5.17)。..。如果由求值产生不确定值,则行为是未定义的,除非在下列情况下:
- [...]
- the operand of a cast or conversion to an unsigned narrow character type (4.7, 5.2.3, 5.2.9, 5.4)
- [...]
然后操作的结果是一个不确定的值。
示例:
int f(bool b) {无符号字符c;无符号char d= c;// OK,d具有不确定值int e= d;//未定义行为返回b?如果b为true,则D: 0;//未定义的行为
所以(让我吃惊的是)标准支持了这一点。
至于为什么,最可能的原因也可以在标准中找到:
§3.9.1基本类型basic.fundamental 1 ..。对于无符号窄字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型的
顺便提一句,我刚刚意识到这可以被一个邪恶的面试官所利用:
在定义良好的行为中,可以将对象的有效值更改为未定值吗?如果是,怎么做?
一个。
unsigned char ind;
unsigned char x = 24;
x = ind; // x had a valid value, now x has an indetermined value
发布于 2017-08-04 04:23:17
从您引用的页面中:从不确定值分配是未定义的行为,
如果无符号窄字符类型或std::字节的不确定值分配给另一个具有无符号窄字符类型或std::字节的变量(变量的值变为不确定的,但行为不是未定义的)
我认为这是因为默认初始化可能会将任何比特组合放入变量中,虽然标准保证一个无符号的窄字符类型可以接受由每个可能的位模式表示的值,但是对于其他类型却没有这样的保证。
发布于 2017-08-04 04:20:13
来自链接页面
默认情况下使用不确定值初始化任何类型的非类变量都是未定义的行为.但下列情况除外: ..。 如果使用无符号窄字符类型或std::字节的不确定值来初始化具有无符号窄字符类型或std::字节的另一个变量;
unsigned char
是一个无符号的窄字符,因此这是不发生UB的例外情况之一。
https://stackoverflow.com/questions/45506400
复制相似问题