运算符如何在数组声明中运行?

时间:2013-01-17 13:01:52

标签: c++

为什么int a[x,y]会转换为a[y],因为逗号运算符从左到右运算?我期待a[(x,y)],因为内部操作将首先完成。但是在第一个中它应该采用第一个参数。

我不打算使用逗号运算符进行数组初始化,只是问为什么会发生这种情况。

我在一本书中看到它,我很困惑。

更新

Wikipedia says

 i = a, b, c;            // stores a into i 
 i = (a, b, c);          // stores c into i   

因此,第一行代码在数组中表示必须将第一个值分配给数组。注意:我实际上并不打算使用它。我只是问问。我正在学习C ++,我在一本书中读到了一个数组声明中的[y,x];所以它应该是[y],x;没有税]。为什么编译器会这样做?

2 个答案:

答案 0 :(得分:9)

逗号运算符,也称为“遗忘”运算符。它执行以下操作:

  1. 完全评估左操作数
  2. 忘记其价值
  3. 完全评估正确的操作数
  4. 使用右操作数的值作为整个运算符表达式的值。
  5. 所以在你的情况下,它的行为就像它应该的那样。 a[x, y]首先评估x,然后丢弃其值,然后使用y的值作为整个表达式的值(括号中的值)。

    修改

    关于使用维基百科进行编辑。请注意,,的优先级低于=的优先级。换句话说,

    i = a, b, c;
    

    被解释为

    (i = a), b, c;
    

    这就是a被复制到i的原因。但是,整个表达式的结果仍为c

答案 1 :(得分:0)

我相信您的编译器假设您要添加括号。在C ++中有一个逗号运算符和一个逗号分隔符。逗号运算符必须将其自身及其操作数括在括号中。 int数组构造函数只需要一个值,所以我猜你的编译器正试图帮助你。

http://msdn.microsoft.com/en-us/library/zs06xbxh(v=vs.80).aspx

编辑:int a [x,y]无效; int [(x,y)]有效;他的编译器假设他打算添加括号。在更一般的上下文中,逗号运算符不需要括号。在函数调用和初始化程序中,需要使用括号来区分使用逗号运算符和逗号分隔符。