据微软称,C++中的运营商在visual studio C++ 2010 http://msdn.microsoft.com/en-us/library/x04xhy0h.aspx中是相同的。
但是,请查看以下构建:
int^ number = 32;
if (number < 100)
MessageBox::Show("The number is not greater than 100");生成失败的“<”:“系统::Int32 32^”未定义此运算符或转换为预定义运算符可接受的类型
if (number <= 100)
MessageBox::Show("The number is not greater than 100");生成失败的“<=”:“System::Int32 32^”未定义此运算符或转换为预定义运算符可接受的类型
if (number == 32)
MessageBox::Show("The is equal to 32");建造成功..。但是,没有显示消息。
if (number = 32)
MessageBox::Show("The is equal to 32");建设成功..。将显示该消息。(为什么?相等的操作符是==)
为什么会发生这种情况?
发布于 2013-09-29 20:04:54
int^声明了一个对象的句柄。无论何时直接引用number,实际上都是引用一个装箱整数(与C#中的(object)32相当)。
此外,对象的句柄在与整数文本比较时不定义<或<= (或>或>=)运算符。其原因可从以下几个方面加以扣除:
但是,它们确实定义了一个==操作符。但是为了进行比较,您要比较的文字值将被隐式装箱,使得比较(在某种程度上)等同于这个C#代码:
object number = 32;
if (number == (object)32)
MessageBox.Show("The number is equal to 32");该比较将检查引用是否相同。但它们不是-它们是两个不同的物体。因此:
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^
if (*number == 32)
MessageBox::Show("The number is equal to 32");..。或者简单地使用int
int number = 32;编辑:是根据Ben的更正确的解释改写的。
https://stackoverflow.com/questions/19082091
复制相似问题