C++ 假设p是一个指针,那么;p>;nullptr";好的?

C++ 假设p是一个指针,那么;p>;nullptr";好的?,c++,pointers,c++11,language-lawyer,c++14,C++,Pointers,C++11,Language Lawyer,C++14,给定一个指针p: char *p ; // Could be any type 假设p正确初始化,则以下格式正确: if (p > 0) // or p > nullptr 更一般地说,当一个操作数是指针,另一个是空指针常量时,使用关系运算符是否格式良好 在C++14中,此代码的格式不正确,但在C++14之前,此代码的格式正确(但结果未指定),如下所示: 在C中,这是格式错误的(参见C99 6.5.8): 是的,在C++14中,这段代码是格式良好的,p和q都是指针,但比较的结果未

给定一个指针
p

char *p ; // Could be any type
假设
p
正确初始化,则以下格式正确:

if (p > 0) // or p > nullptr

更一般地说,当一个操作数是指针,另一个是空指针常量时,使用关系运算符是否格式良好

在C++14中,此代码的格式不正确,但在C++14之前,此代码的格式正确(但结果未指定),如下所示:

在C中,这是格式错误的(参见C99 6.5.8):

是的,在C++14中,这段代码是格式良好的,
p
q
都是指针,但比较的结果未指定。两个指针的定义比较在段落
3
中列出,并说明:

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

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

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

  • 如果两个指针递归地指向同一对象的不同非静态数据成员,或指向此类成员的子对象,则 指向后面声明的成员的指针比较大,前提是 成员具有相同的访问控制(第11条),并提供 阶级不是联盟

此处和后面的段落
4
中没有定义空指针值,它说:

[…]否则,未指定每个运算符的结果

在C++11中,它特别使段落
3
中未指定的结果:

如果同一类型的两个指针p和q指向不同的对象 不是同一对象的成员或同一数组的元素 或者对于不同的函数,或者如果其中只有一个为null,则结果 对于pq,p=q未指定。


它的意思是
char*p=“”;char*q=nullptr;如果(p>q){
还可以吗?@RSahu我对标准草案中未引用的
3
4
段的理解是,该比较的结果未指明,但形式良好,因为
p
q
都是指针。第3段非常奇怪。在实际情况中,如果一个实现必须在两个或两个都不为null的情况下进行比较,并且如果它们是同一对象的成员或同一数组的元素,那么如果不满足这些条件,那么使结果变得不可预测和不符合逻辑似乎是相当棘手的。对我来说,这是一个非常混乱和超特定的约束集。(虽然它肯定是C++中的传统,它将异常添加到规则的例外,并帮助带帮助,以帮助创可贴,我想。”我认为只有在不弯曲概念的情况下,才能确保一个明确定义的排序。@ JasonC,在C++中查看指针比较等的方法是考虑一个严重分段的内存模型。指针分为高位和低位字组件,高位字是段。这些部分重叠。给定的C++结构必须适合于给定的段(实际上它通常不允许到达结束),这使得许多指针比较只发生在低字数据上,通常是高性能的增加。null可能是0段0偏移指针,也可能是-1段-1偏移指针,因为0 0用于硬件中的某些内容!
void f(char* s) {
    if (s < 0) { }
}
char* p = "";
char* q = nullptr;
if ( p > q ) {}