根据微软的说法,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");
构建失败 '&LT;' :'System :: Int32 ^'未定义此运算符或转换为预定义运算符
可接受的类型if (number <= 100)
MessageBox::Show("The number is not greater than 100");
构建失败 '&lt; =':'System :: Int32 ^'没有定义此运算符或转换为预定义运算符可接受的类型
if (number == 32)
MessageBox::Show("The is equal to 32");
构建成功...但是不显示消息。
if (number = 32)
MessageBox::Show("The is equal to 32");
构建成功..显示消息。 (为什么?等式的运算符是==)
为什么会这样?
答案 0 :(得分:2)
int^
声明handle to an object。每当你直接引用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 Voigt更正确的解释重写。