void指针之间的比较,它是定义的还是依赖于编译器的



我试图比较将int转换为void*是否有效,甚至比较它们之间的

int i=1,j=2;
float a=1.1;
if((void *)i > (void *)j )
cout<<"i>j"<<endl;
else
cout<<"i<j"<<endl;

输出为

i<j

但是这个

if((void *)a > (void *)i )
cout<<"a>i"<<endl;
else
cout<<"a<i"<<endl;

给出错误

 error: invalid cast from type ‘float’ to type ‘void*’

我想我们可以把任何东西投到无效指针上吗?不是吗?

void指针之间的比较,它是定义的还是依赖于编译器的?

这是定义明确的,但结果通常是未指定的,如C++11 5.9/3所述:"如果两个指针都表示相同的地址或都是空指针值,则如果运算符为<=或>=,则结果为true,否则为false;否则结果为未指定。"

请注意,std::less和友元需要定义指针的总顺序,即使内置运算符没有。

然而,使用从任意整数值转换而来的指针执行任何操作都会产生未定义的行为。

我想我们可以把任何东西投到无效指针上吗?不是吗?

没有。reinterpret_cast(或等效的C样式强制转换)可以在指针类型和整数类型之间进行转换。将浮点值转换为指针毫无意义。

我想我们可以把任何东西投到无效指针上吗?不是吗?

void*用于向强制转换任何对象指针类型,而不是任何类型

这意味着你可以做:

if((void *)&a > (void *)&i )

然而,像这样检查和比较指针值很少有用。

您可以将"any"(不是函数或其"地址"由指向成员的指针给定)的地址强制转换为void *。此外,一些积分类型可以强制转换为指针。我想你想做的是这个

if((void *)&i > (void *)&j )
    cout<<"i>j"<<endl;
else
    cout<<"i<j"<<endl;

以及

if((void *)&a > (void *)&i )
    cout<<"a>i"<<endl;
else
    cout<<"a<i"<<endl;

然而,请注意,根据C++11 5.9/3(正如Mike Seymour在他的帖子中所解释的那样),这种指针比较的结果是未指定的。

比较相同类型指针的最佳方法是使用模板greaterlessgreater_equalless_equal,因为20.8.5/8表示:

对于模板greaterlessgreater_equalless_equal,即使内置运算符<><=>=没有,任何指针类型的专门化也会产生总顺序。

因此,您应该使用

if (std::greater<void*>()((void *) &i, (void *) &j))
    cout<<"i>j"<<endl;
else
    cout<<"i<j"<<endl;

您可以将任何对象指针类型强制转换为void*,而不是任何类型。

所以你可以用来解决你的问题

if((void *)&a > (void *)&i )
//         ^            ^

但是比较两个变量的地址与比较值不是一回事我认为你不会得到你想要的结果。。。您将在此处有未定义的行为

最新更新