unspecified-behavior相关内容

C++ 中的指针比较是未定义或未指定的行为吗?

Stroustrup 的 C++ 编程语言第 3 版说, 指针的减法只有在两个指针都指向时才定义同一个数组的元素(虽然语言没有快速的方法确保情况如此).当从另一个指针中减去一个指针时,结果是两个指针之间的数组元素数(一个整数).可以将一个整数加到一个指针上或减去一个来自指针的整数;在这两种情况下,结果都是一个指针值.如果该值不指向与原始指针或超出的指针,使用该值的结果是未定义. 例如: ..
发布时间:2021-12-13 13:27:34 C/C++开发

比较指向不同数组的指针是否相等是未指定的行为吗?

相等运算符在指针上具有关系运算符的语义限制: ==(等于)和 !=(不等于)运算符与关系运算符具有相同的语义限制、转换和结果类型,但它们的优先级和真值结果较低.[C++03 §5.10p2] 关系运算符对比较指针有限制: 如果两个相同类型的指针 p 和 q 指向不同的对象,这些对象不是同一对象的成员或同一数组的元素或不同的函数,或者只有其中一个为空,则 p ..
发布时间:2021-12-13 13:22:16 C/C++开发

未定义、未指定和实现定义的行为

什么是 C 和 C++ 中的未定义行为 (UB)?未指定的行为和实现定义的行为呢?它们有什么区别? 解决方案 未定义行为 是 C 和 C++ 语言中令程序员感到惊讶的方面之一来自其他语言(其他语言试图更好地隐藏它).基本上,即使许多 C++ 编译器不会报告程序中的任何错误,也可以编写不以可预测方式运行的 C++ 程序! 我们来看一个经典的例子: #include int main( ..

取消引用 NULL 指针是否被视为未指定或未定义的行为?

stackoverflow 问题的共识说这是未定义的行为. 然而,我最近看到了 Charles Bay 2016 年的演讲,题为: 指令重新排序:C++“As-If"规则和序列的作用. 在 37:53,他展示了以下内容: C++ 术语 未定义行为:缺乏约束 (全局初始化顺序) 未指明行为:违反约束 (取消引用 NULL指针) 现在我有相互矛盾的信息. 这 ..

在C ++中,访问未初始化的数组是未指定的行为还是未定义的行为?

例如,在以下代码中: int myarray [3];int x = myarray [1]; 是否保证代码在恒定时间内成功执行,并且 x 具有一定的整数值?还是编译器可以完全跳过发射代码/发射代码以启动GNU Chess并仍然符合C ++标准? 这在类似于数组的数据结构中很有用,但是可以在恒定时间内初始化.(对不起,请不要随身携带Aho,Hopcroft和Ullman的副本,因此无 ..
发布时间:2021-04-19 19:06:04 C/C++开发

使用指定的初始化程序初始化数组时出现奇怪的值

当我初始化下面的数组时,除values[3]以外的所有输出都可以.由于某些原因,初始化为values[0]+values[5]的values[3]输出很大的数字.我的猜测是,我试图在values[0]+values[5]正确分配之前将它们分配给内存,但是如果有人可以解释的话,那会很好. int main (void) { int values[10] = { [0 ..

C ++中的指针比较是未定义的还是未指定的行为?

Stroustrup编写的C ++编程语言第三版说, 仅当两个指针都指向时定义指针的减法 同一数组的元素(尽管语言没有快速的方法 确保是这种情况).当从另一个指针中减去一个指针时, 结果是两个指针之间的数组元素数 (一个整数).可以向指针添加整数或减去 指针的整数;在两种情况下,结果都是一个指针值. 如果该值未指向与 原始指针或其他指针,则使用该值的结果是 未定义. 例如: vo ..
发布时间:2020-05-28 21:18:29 C/C++开发

是否不确定标准库头是否包含任意头?

C ++标准库头可能在未指定的情况下互相包括 方式,所以程序员通常不应该依赖一个标头 包括另一个. [...] 在实践中,情况往往如此.例如,可能包含,在其他情况下,您需要显式包含.但是,我似乎找不到在N4140中的情况.我看过: §2.9[lex.header] §17.6.1.2[标题] §17.6.2.2[using.hea ..
发布时间:2020-04-27 04:52:13 C/C++开发

什么时候可以做/使用有未指定行为的东西?

在C ++中,有些东西出现在明确定义和未定义之间。具体来说,这些被称为实现定义和未指定。现在,我对未指定的内容感兴趣。 什么时候可以使用这些功能,什么时候应该避免?有没有良好的未指定行为的例子是正确的代码的一部分? 由Matt McNabb提供的定义: 未定义 - 可以发生任何事情 未指定 - 有限数量的结果是可能的 - 通常标准描述了可能的结果集 明确定义 - 以上 ..

如果复合表达式中的多个操作数修改同一对象,那么它是未定义的行为吗?

如果在复合表达式中有多个操作数修改同一个对象,我会模糊地记得阅读某个地方是未定义的行为。 我相信这个UB的一个例子显示在下面的代码,但是我编译在g ++,clang ++和visual studio和所有他们打印出相同的值,并不能在不同的编译器产生不可预测的值。 #include int a(int& lhs){lhs - = 4; return l ..

一个空的基类是否会影响派生类的布局?

C ++标准(引自草案n3242)说明了关于subobjects [intro.object]的以下内容: 位字段或零基本类子对象 大小,该对象的地址是它 占据的第一个字节的地址。两个不同的对象,既不是位字段也不是基本的 类子对象零大小应具有不同的地址。 给定以下代码段: struct empty {}; struct member:empty {}; struc ..
发布时间:2016-10-20 21:33:54 C/C++开发

在返回对象的函数调用和该对象上的方法调用之间是否有序列点?

如果我写 f(x) - > g(args,...)我可以依赖于 f x 在 args,... 的评估之前?我可以看到两种方式的参数: §1.9.17“当调用函数(无论函数是否为内联函数)在函数体中执行任何表达式或语句之前发生的所有函数参数(如果有)之后的序列点。在复制返回值之后,在执行之前还有一个序列点“ 另一方面,对象指针隐含地是一个隐藏的参数 this as如果我写的 g(f(x),a ..
发布时间:2016-10-14 20:14:38 C/C++开发

它是未指定的行为比较指针到不同的数组的平等?

相等运算符具有关系运算符对指针的语义限制: ==(等于)和!=不等于)运算符具有与关系运算符相同的语义限制,转换和结果类型,除了它们的较低优先级和真值结果。 [C ++ 03§5.10p2] 关系运算符对比较指针有一个限制: 如果同一类型的两个指针p和q指向不是同一对象或同一数组或不同函数的元素的成员的不同对象,或者只有它们中的一个为空,p q,p = q的结果是未指定的。 [§ ..
发布时间:2016-10-14 10:26:16 C/C++开发

这个代码来自“C ++编程语言”第4版第36.3.6节有明确的行为?

在Bjarne Stroustrup的 C ++编程语言 第4版部分 36.3.6 类似STL的操作,以下代码用作链接: void f2() { std :: string s =“但我听说它工作,即使你不相信它”; s.replace(0,4,“”).replace(s.find(“even”),4,“only”) .replace(s.find(“do not”) ,6“,” ..

为(x ++,y)+(Y +,X)未定义或不确定的,如果没有指定,那是什么计算?

借助逗号序列算引入的顺序点在离pression 。我想知道这是否意味着,下面的程序避免不确定的行为。 INT X,Y;诠释的main() { 回报(X ++,Y)+(Y +,X); } 如果它确实避免不确定的行为,它可能仍然是不确定的,也就是说,返回几个可能的值之一。我认为,在C99,它只能计算 1 ,但实际上,GCC的各种版本编译这个程序进入返回可执行 2 。锵生成返回一个可执行 1 ..
发布时间:2016-08-24 13:18:43 C/C++