Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指针比较在C+中是未定义的还是未指定的行为+;? Stroustrup的C++程序设计语言第三版本说,_C++_Pointers_Undefined Behavior_Unspecified Behavior - Fatal编程技术网

指针比较在C+中是未定义的还是未指定的行为+;? Stroustrup的C++程序设计语言第三版本说,

指针比较在C+中是未定义的还是未指定的行为+;? Stroustrup的C++程序设计语言第三版本说,,c++,pointers,undefined-behavior,unspecified-behavior,C++,Pointers,Undefined Behavior,Unspecified Behavior,只有当两个指针都指向一个指针时,才定义指针减法 相同数组的元素(尽管该语言没有快速的 确保情况属实)。从一个指针减去另一个指针时, 结果是两个指针之间的数组元素数 (整数)。可以在指针上加一个整数,也可以减去一个整数 指针的整数;在这两种情况下,结果都是指针值。 如果该值不指向与 原始指针或一个以上的指针,使用该值的结果为 未定义。 例如: void f () { int v1 [10]; int v2 [10]; int i1 = &v1[5] - &v

只有当两个指针都指向一个指针时,才定义指针减法 相同数组的元素(尽管该语言没有快速的 确保情况属实)。从一个指针减去另一个指针时, 结果是两个指针之间的数组元素数 (整数)。可以在指针上加一个整数,也可以减去一个整数 指针的整数;在这两种情况下,结果都是指针值。 如果该值不指向与 原始指针或一个以上的指针,使用该值的结果为 未定义。

例如:

void f ()
{
    int v1 [10];
    int v2 [10];
    int i1 = &v1[5] - &v1[3];   // i1 = 2
    int i2 = &v1[5] - &v2[3];   // result undefined
}
我在维基百科上读到了。上面说

<>在C和C++中,指针的比较只在指针指向同一对象的成员或同一数组的元素时严格定义。 例如:

int main(void)
{
  int a = 0;
  int b = 0;
  return &a < &b; /* unspecified behavior in C++, undefined in C */
}
int main(无效)
{
int a=0;
int b=0;
C++中未定义的< & & b;/*未指定行为
}
所以,我很困惑。哪一个是正确的?维基百科还是斯特劳斯塔普的书?关于这个C++标准是什么?


如果我误解了什么,请纠正我。

请注意,指针减法和指针比较是具有不同规则的不同操作

C++14 5.6/6,关于减法指针:

除非两个指针都指向同一数组对象的元素,或者一个指针超过数组对象的最后一个元素,否则该行为是未定义的

C++14 5.9/3-4:

将指针与对象进行比较的定义如下:

  • 如果两个指针指向同一数组的不同元素或其子对象,则指向下标较高的元素的指针比较大

  • 如果一个指针指向数组的一个元素或其子对象,而另一个指针指向数组最后一个元素的另一个指针,则后一个指针比较大

  • 如果两个指针递归地指向同一对象的不同非静态数据成员,或指向此类成员的子对象,则如果两个成员具有相同的访问控制且其类不是并集,则指向后一个声明成员的指针会比较大


如果两个操作数
p
q
比较相等(5.10),
p=q
都产生
true
pq
都产生false。否则,如果指针
p
比较大于指针
q
p>=q
p>q
qI不认为这两个摘录有冲突。你能澄清你的困惑吗?Stroustrup指的是指针减法(也称为指针差分法),示例显示了差分计算。你在维基上引用的文章提到了逻辑指针比较。在最后一句话“否则,每个运算符的结果都是未指定的。”为什么它应该是未指定的而不是未定义的?是不是因为标准规定可能的结果只有对错,所以不会发生其他行为?@LorenzoBelli“未定义”是比“未指定”严重得多的错误,从字面上说,任何事情都可能发生,包括程序崩溃。对于未指定的行为,唯一的问题是您不知道结果是
true
还是
false
——编译器可以自由地指定比标准要求更严格的行为。通常,规范编写者希望允许行为良好的程序,并且仅在绝对必要时指定未定义的行为。@LorenzoBelli同样,如果在未指定行为的情况下进行两次比较,则运算符必须返回相同的值。但对于UB,每个比较都可以独立地返回真/假。@AjayBrahmakshatriya:不要求产生未指定结果的操作一致地返回真/假。给定
inta=p>q,b=p>q,c=a
,如果
p
q
识别不相关的对象,编译器可以使
a
b
成为值0和1的任意组合。然而,编译器需要使
c
A
相等。