unspecified-behavior相关内容
Stroustrup 的 C++ 编程语言第 3 版说, 指针的减法只有在两个指针都指向时才定义同一个数组的元素(虽然语言没有快速的方法确保情况如此).当从另一个指针中减去一个指针时,结果是两个指针之间的数组元素数(一个整数).可以将一个整数加到一个指针上或减去一个来自指针的整数;在这两种情况下,结果都是一个指针值.如果该值不指向与原始指针或超出的指针,使用该值的结果是未定义. 例如:
..
相等运算符在指针上具有关系运算符的语义限制: ==(等于)和 !=(不等于)运算符与关系运算符具有相同的语义限制、转换和结果类型,但它们的优先级和真值结果较低.[C++03 §5.10p2] 关系运算符对比较指针有限制: 如果两个相同类型的指针 p 和 q 指向不同的对象,这些对象不是同一对象的成员或同一数组的元素或不同的函数,或者只有其中一个为空,则 p
..
什么是 C 和 C++ 中的未定义行为 (UB)?未指定的行为和实现定义的行为呢?它们有什么区别? 解决方案 未定义行为 是 C 和 C++ 语言中令程序员感到惊讶的方面之一来自其他语言(其他语言试图更好地隐藏它).基本上,即使许多 C++ 编译器不会报告程序中的任何错误,也可以编写不以可预测方式运行的 C++ 程序! 我们来看一个经典的例子: #include int main(
..
stackoverflow 问题的共识说这是未定义的行为. 然而,我最近看到了 Charles Bay 2016 年的演讲,题为: 指令重新排序:C++“As-If"规则和序列的作用. 在 37:53,他展示了以下内容: C++ 术语 未定义行为:缺乏约束 (全局初始化顺序) 未指明行为:违反约束 (取消引用 NULL指针) 现在我有相互矛盾的信息. 这
..
例如,在以下代码中: int myarray [3];int x = myarray [1]; 是否保证代码在恒定时间内成功执行,并且 x 具有一定的整数值?还是编译器可以完全跳过发射代码/发射代码以启动GNU Chess并仍然符合C ++标准? 这在类似于数组的数据结构中很有用,但是可以在恒定时间内初始化.(对不起,请不要随身携带Aho,Hopcroft和Ullman的副本,因此无
..
当我初始化下面的数组时,除values[3]以外的所有输出都可以.由于某些原因,初始化为values[0]+values[5]的values[3]输出很大的数字.我的猜测是,我试图在values[0]+values[5]正确分配之前将它们分配给内存,但是如果有人可以解释的话,那会很好. int main (void) { int values[10] = { [0
..
Stroustrup编写的C ++编程语言第三版说, 仅当两个指针都指向时定义指针的减法 同一数组的元素(尽管语言没有快速的方法 确保是这种情况).当从另一个指针中减去一个指针时, 结果是两个指针之间的数组元素数 (一个整数).可以向指针添加整数或减去 指针的整数;在两种情况下,结果都是一个指针值. 如果该值未指向与 原始指针或其他指针,则使用该值的结果是 未定义. 例如: vo
..
#include int foo() { std::cout
..
给出以下代码: std::ofstream stream("somefile"); if (!stream) { return 1; } 调用 .write(....)并使用 stdc ++ 和 libc ++ 时,流处于二进制模式(std::ios::binary) . 但是,当使用 MSVC (2015/2017RC1)时,它似乎处于文本模式或某种奇怪的状态,因为生成的
..
C ++标准库头可能在未指定的情况下互相包括 方式,所以程序员通常不应该依赖一个标头 包括另一个. [...] 在实践中,情况往往如此.例如,可能包含,在其他情况下,您需要显式包含.但是,我似乎找不到在N4140中的情况.我看过: §2.9[lex.header] §17.6.1.2[标题] §17.6.2.2[using.hea
..
考虑以下代码: #include #include #include int main() { std::invoke(std::boolalpha, std::cout); // #1 using ctype_func = int(*)(int); char c = std::invoke(sta
..
在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
..
假设我有以下: #include struct A {int x; }; class B { B(int x,std :: unique_ptr a); }; class C:public B { C(std :: unique_ptr a):B(a-> x,std :: move(a)){} }; 如果我正确理解
..
如果我写 f(x) - > g(args,...)我可以依赖于 f x 在 args,... 的评估之前?我可以看到两种方式的参数: §1.9.17“当调用函数(无论函数是否为内联函数)在函数体中执行任何表达式或语句之前发生的所有函数参数(如果有)之后的序列点。在复制返回值之后,在执行之前还有一个序列点“ 另一方面,对象指针隐含地是一个隐藏的参数 this as如果我写的 g(f(x),a
..
在回答此问题后,对于所讨论的代码是否是未定义的行为存在一个长时间的讨论。这里是代码: std :: map
..
相等运算符具有关系运算符对指针的语义限制: ==(等于)和!=不等于)运算符具有与关系运算符相同的语义限制,转换和结果类型,除了它们的较低优先级和真值结果。 [C ++ 03§5.10p2] 关系运算符对比较指针有一个限制: 如果同一类型的两个指针p和q指向不是同一对象或同一数组或不同函数的元素的成员的不同对象,或者只有它们中的一个为空,p q,p = q的结果是未指定的。 [§
..
在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“,”
..
借助逗号序列算引入的顺序点在离pression 。我想知道这是否意味着,下面的程序避免不确定的行为。 INT X,Y;诠释的main() { 回报(X ++,Y)+(Y +,X); } 如果它确实避免不确定的行为,它可能仍然是不确定的,也就是说,返回几个可能的值之一。我认为,在C99,它只能计算 1 ,但实际上,GCC的各种版本编译这个程序进入返回可执行 2 。锵生成返回一个可执行 1
..