2

根据微软的说法,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");

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

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

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

if (number == 32)
    MessageBox::Show("The is equal to 32");

构建成功...但是没有显示该消息。

if (number = 32)
    MessageBox::Show("The is equal to 32");

构建成功.. 显示消息。(为什么?等式的运算符是==)

为什么会这样?

4

1 回答 1

2

int^声明一个对象的句柄。每当您number直接引用时,您实际上是在引用一个装箱的整数(有点相当于(object)32C# 中的)。

此外,在与整数文字进行比较时,对象的句柄不定义<or <=(或>or )运算符。>=其原因可以从以下方面推断:

但是,它们确实定义了一个==运算符。但为了比较,您要比较的文字值将被隐式装箱,使比较(在某种程度上)等同于以下 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

...并且由于您正在比较引用而不是值,因此>, >=, <=,<没有什么意义。

在您的最后一种情况下,您分配 32number,然后检查该表达式的结果(它本身是 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 更正确的解释重写。

于 2013-09-29T20:04:54.387 回答