Непонятная ситуация с массивами

 

Господа!

Не пойму почему компелятор ругается?

Из "Учебника MQL-4" и "Справочника MQL-4" - к многомерным массивам можно обращаться следующими вариантами:


Array[x][y] или Array[x,y].


В соответствии с этими правилами пишу все обращения в виде Array[x,y]. Но иногда компелятор ругается на такую запись.

Вот несколько примеров, когда он ругается:

double Complex [100,2];
int
    X = 0,
    Y = 1;

//---- -------------------
bool Func_1( int Z1, int Z2 ) {
   
//   double C = Complex[Z1,X];      // Ругается на запись
   double C = Complex[Z1][X];     // Нормально пропускает
   
//   double D = Complex[Z1,Y];      // Ругается на запись
   double D = Complex[Z1][Y];     // Нормально пропускает
   
   // ----Ругается на запись-----
//   bool Result = Complex[Z1,X]==Complex[Z2,X] && Complex[Z1,Y]==Complex[Z2,Y];
   // ----Нормально пропускает----
   bool Result = Complex[Z1][X]==Complex[Z2][X] && Complex[Z1][Y]==Complex[Z2][Y];
   return(Result);
}

//---- -------------------
bool Func_2( int Z1, int Z2  ) {
   // ----Нормально пропускает----
    bool Result = (Complex[Z1,X]!=Complex[Z2,X]) || (Complex[Z1,Y]!=Complex[Z2,Y]);
    return(Result);
}

Я умышленно закомментировал некорректные по мнению компилятора записи. Но при всём при этом следующая функция - нормально компелируется в любом виде.

Ведь записи-то во всех случаях, теоретически, корректны.

При этом, если запись Result = Complex[Z1,X]==Complex[Z2,X] && Complex[Z1,Y]==Complex[Z2,Y] разделить скобками:

Result = (Complex[Z1,X]==Complex[Z2,X]) && (Complex[Z1,Y]==Complex[Z2,Y]) запись принимается.

Точно так же с записями D=Complex[Z1,Y] - не проходит, однако - D=(Complex[Z1,Y]) - проходит.

Итересно почему же? Где тут собака зарыта, и что здесь противоречит правилам? Где ошибка?

 

Если в скобки взять, компилируется

bool Result = (Complex[Z1,X]==Complex[Z2,X] && Complex[Z1,Y]==Complex[Z2,Y]);
 

Объявление массивов

Вариант объявления только - тип имя_массива[][][];

теоретически объявление и обращение разные понятия (термины)

Приоритеты и порядок выполнения операций

bool Result = Complex[Z1][X]==Complex[Z2][X]&&Complex[Z1][Y]==Complex[Z2][Y];
            |        1   2  |        3   4  |        5   6  |          7  8  
            |               |               9               |
            |               10                              11
            12
//Но в этом случае, предположу что "," имеет наименьший приоритет??? И присвоение "срабатывает" раньше, чем вычисление правой части от присвоения???
bool Result = Complex[Z1,X]==Complex[Z2,X]&&Complex[Z1,Y]==Complex[Z2,Y];
 
Integer:

Если в скобки взять, компилируется

Ну да. В скобках - принимает, а без не принимает - не понятно.

karakuts:

Но в этом случае, предположу что "," имеет наименьший приоритет??? И присвоение "срабатывает" раньше, чем вычисление правой части от присвоения???

Возможно, возможно, только я таких вариантов написал не мало (математику двумерных массивов описываю), ну так похожие варианты - свободно принимает и без скобок:

//-----------------------
double Func_3( int Z, int Z1, int Z2, double R ) {

    Complex[Z,X] = -Complex[Z1,X];
    
Complex[Z,X] = 2 * Complex[Z1,X] * Complex[Z1,Y];
    
Complex[Z,X] = Complex[Z1,X] + Complex[Z2,X];
    
Complex[Z,X] = Complex[Z1,X]*Complex[Z2,X] - Complex[Z1,Y]*Complex[Z2,Y];
    Complex[Z,X] = Complex[Z1,X] + R;
    Complex[Z,Y] = Complex[Z1,Y];

    return(0);
}

Во всех этих случаях компилятор и глазом не моргнул - "съел". А там - начал ругаться.

Вот и встаёт вопрос - а правильно ли он меня понимает?

Причина обращения: