首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么运算符不能在C++-CLI中工作?

为什么运算符不能在C++-CLI中工作?
EN

Stack Overflow用户
提问于 2013-09-29 19:06:39
回答 1查看 414关注 0票数 2

据微软称,C++中的运营商在visual studio C++ 2010 http://msdn.microsoft.com/en-us/library/x04xhy0h.aspx中是相同的。

但是,请查看以下构建:

代码语言:javascript
复制
int^ number = 32;

if (number < 100)
    MessageBox::Show("The number is not greater than 100");

生成失败的“<”:“系统::Int32 32^”未定义此运算符或转换为预定义运算符可接受的类型

代码语言:javascript
复制
if (number <= 100)
    MessageBox::Show("The number is not greater than 100");

生成失败的“<=”:“System::Int32 32^”未定义此运算符或转换为预定义运算符可接受的类型

代码语言:javascript
复制
if (number == 32)
    MessageBox::Show("The is equal to 32");

建造成功..。但是,没有显示消息。

代码语言:javascript
复制
if (number = 32)
    MessageBox::Show("The is equal to 32");

建设成功..。将显示该消息。(为什么?相等的操作符是==)

为什么会发生这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-29 20:04:54

int^声明了一个对象的句柄。无论何时直接引用number,实际上都是引用一个装箱整数(与C#中的(object)32相当)。

此外,对象的句柄在与整数文本比较时不定义<<= (或>>=)运算符。其原因可从以下几个方面加以扣除:

但是,它们确实定义了一个==操作符。但是为了进行比较,您要比较的文字值将被隐式装箱,使得比较(在某种程度上)等同于这个C#代码:

代码语言:javascript
复制
object number = 32;
if (number == (object)32)
    MessageBox.Show("The number is equal to 32");

该比较将检查引用是否相同。但它们不是-它们是两个不同的物体。因此:

代码语言:javascript
复制
int^ number = 32;
if (number == 32)
    MessageBox::Show("The number is equal to 32"); // isn't displayed

..。而且,由于您比较的是引用而不是值,所以>>=<=<没有什么意义。

在最后一个例子中,您将32分配给number,然后检查该表达式的结果(它本身是32)是否与0不同--确实如此,因此将显示消息。这就是if在C++ (和C)中所做的--在C#中,number = 32确实有结果32,但是由于if需要一个布尔值,所以会出现编译器错误。

“解决方案”:删除int^

代码语言:javascript
复制
if (*number == 32)
    MessageBox::Show("The number is equal to 32");

..。或者简单地使用int

代码语言:javascript
复制
int number = 32;

编辑:是根据Ben的更正确的解释改写的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19082091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档