当前位置: 首页 > 知识库问答 >
问题:

C++标准在C++14中使用不确定值和未定义行为方面是否发生了变化?

袁何平
2023-03-14
int x = 12;
{ int x = x; }
unsigned char x = 12;
{ unsigned char x = x; }

在C++14中,关于不定值和未定义行为的一些变化是否导致了示例中的这种变化?

共有1个答案

范楚
2023-03-14

是的,这种变化是由语言的变化驱动的,如果计算产生了一个不确定的值,它就会成为未定义的行为,但对于无符号窄字符有一些例外。

缺陷报告1787,其建议文本可在N39141中找到,最近于2014年被接受,并纳入最新的工作草案N3936:

关于不确定值,最有趣的变化是8.5节第12段:

丢弃值表达式(子句5[expr]),

则运算的结果是一个不确定的值。

如果通过对一个简单赋值html" target="_blank">运算符(5.17[expr.ass])的右操作数求值产生一个无符号窄字符类型(3.9.1[Basic.Basic])的不定值,该运算符的第一个操作数是无符号窄字符类型的lvalue,则不定值将替换左操作数引用的对象的值。

int f(bool b) {
  unsigned char c;
  unsigned char d = c; // OK, d has an indeterminate value
  int e = d;           // undefined behavior
  return b ? d : 0;    // undefined behavior if b is true
}

[...]如果对象未初始化,则需要进行此转换的程序具有未定义的行为。[...]

脚注:

  1. 1787是缺陷报告616的修订版,我们可以在N3903
  2. 中找到该信息
 类似资料:
  • C 14的[class]/7中定义了一个标准布局类,如下所示(重点是我的): 标准布局类是这样的类: (7.1)-没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员, (7.2)-没有虚拟函数(10.3)和虚拟基类(10.1), (7.3)-对所有非静态数据成员具有相同的访问控制(第11条), (7.4)-没有非标准布局基类, (7.5)-在大多数派生类中没有非静态数据成员,并且最多有

  • 问题内容: 您如何知道在运行时是否已在代码的特定位置设置了变量?这并不总是很明显,因为(1)可以有条件地设置变量,而(2)可以有条件地删除变量。我正在寻找类似Perl或PHP或Ruby中的东西。 问题答案: try: thevariable except NameError: print(“well, it WASN’T defined after all!”) else: print(“sure

  • 问题:被忽略的返回值是立即被析构还是在超出范围的时候被析构?? 下面的代码返回我的编译器 输出: 谁制造它,谁就不需要它。 谁买了它,它就没用了。 使用它的人既看不到也感觉不到它。 这是怎么一回事? 因此,被忽略的值会被立即析构。但是这个编译器是特定的还是标准行为的呢?

  • 我想找到最快的方法来检查标准C 11、14、17或C中是否存在文件。我有数千个文件,在对它们执行操作之前,我需要检查它们是否都存在。在下面的函数中,我可以写什么来代替*/?