void指针之间的比较,它是定义的还是依赖于编译器的
comparison between void pointer, is it defined or compiler dependent?
我试图比较将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在他的帖子中所解释的那样),这种指针比较的结果是未指定的。
比较相同类型指针的最佳方法是使用模板greater
、less
、greater_equal
和less_equal
,因为20.8.5/8表示:
对于模板
greater
、less
、greater_equal
和less_equal
,即使内置运算符<
、>
、<=
和>=
没有,任何指针类型的专门化也会产生总顺序。
因此,您应该使用
if (std::greater<void*>()((void *) &i, (void *) &j))
cout<<"i>j"<<endl;
else
cout<<"i<j"<<endl;
您可以将任何对象指针类型强制转换为void*
,而不是任何类型。
所以你可以用来解决你的问题
if((void *)&a > (void *)&i )
// ^ ^
但是比较两个变量的地址与比较值不是一回事我认为你不会得到你想要的结果。。。您将在此处有未定义的行为。
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 为什么内存屏障依赖于变量?
- 如何定义依赖于参数包转换的函数的返回类型
- FBString 的小字符串优化是否依赖于未定义的行为?
- 如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
- 如何定义具有依赖于符号调试的参数的函数
- 如何从同一个头文件中定义 2 个类,而一个类依赖于另一个类
- 在全局命名空间中重载不依赖于用户定义类型的标准定义类型的运算符是否格式正确?
- 构建不依赖于MSVCR120.DLL的自定义英特尔 MKL DLL
- 如何定义依赖于模板参数的类型定义
- 链接自身依赖于静态库的静态库时未定义的引用
- 此代码是否依赖于函数调用顺序未定义的行为
- void指针之间的比较,它是定义的还是依赖于编译器的
- 对依赖于参数的查找和友元函数定义的混淆
- 依赖于实现的行为和未定义的行为之间有什么区别吗
- 使用"std::conditional_t"定义依赖于其模板参数的类"typedef"
- 类型定义应该依赖于模板参数
- C++std列表排序使用自定义比较器,该比较器依赖于对象实例的成员变量
- CMake依赖于已定义的(预处理器)头文件
- 如何制作自定义MSBuild目标's的执行依赖于文件's的时间戳