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

p.j*_*p.j 0 c++ pointers

我试图比较一个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;
Run Code Online (Sandbox Code Playgroud)

输出是

i<j
Run Code Online (Sandbox Code Playgroud)

但是这个

if((void *)a > (void *)i )
cout<<"a>i"<<endl;
else
cout<<"a<i"<<endl;
Run Code Online (Sandbox Code Playgroud)

给出错误

 error: invalid cast from type ‘float’ to type ‘void*’
Run Code Online (Sandbox Code Playgroud)

我以为我们可以抛出任何东西来搞乱指针?是不是这样?

Mik*_*our 5

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

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

请注意std::less,即使内置运算符没有,也要求朋友定义指针的总顺序.

但是,使用从任意整数值转换的指针执行任何操作都会产生未定义的行为.

我以为我们可以抛出任何东西来搞乱指针?是不是这样?

No. reinterpret_cast(或等效的C样式转换)可以在指针和整数类型之间进行转换.将浮点值转换为指针根本没有意义.

  • 如果你很好奇为什么它没有指定,请阅读分段存储器模型:C++标准提供的自由度,在某些情况下,只能在段偏移*上进行指针比较*在其他情况下,你可以只比较段和偏移而不是在内存中的位置(段可以重叠). (2认同)