А С++, оказывается тоже не честный!

void setup() {
  Serial.begin(9600);

  int a[] = {1, 2, 3, 4, 5};
  int k;

  k = 0;
  Serial.print("k[0] = ");
  Serial.println(k[a]);

  k = 1;
  Serial.print("k[1] = ");
  Serial.println(k[a]);

  k = 2;
  Serial.print("k[2] = ");
  Serial.println(k[a]);

  k = 3 ;
  Serial.print("k[3] = ");
  Serial.println(k[a]);

  k = 4;
  Serial.print("k[4] = ");
  Serial.println(k[a]);

}

void loop() {
}

выводит:

k[0] = 1
k[1] = 2
k[2] = 3
k[3] = 4
k[4] = 5

как это так??
я знаю, что местные “гусары” знают в чем подвох, поэтому молчать!

1 лайк

Ничего не перепутал?

Да нее,я кажись суть понимаю. Это очевидно,зная нюансы языка и представления различных типов данных. Но пока промолчу)

а ты попробуй и удивись как и я…

1 лайк

Я ж не гусар (даже усов не имею)…

суть данного явления мне понятна, не понятно как, с точки зрения синтаксиса, это пропускает компилятор?
или для него любая переменная, массив с нулевым индексом?

add
гусарам можно говорить)))

1 лайк

У любой переменной есть адрес, обращение к переменной всегда идет по адресу (у любого массива начало - это адрес первого элемента) и это сходство, а вот что дальше происходит в твоем примере - я понятия не имею :slight_smile:

дальше, переменная превращается в массив, а массив в индекс )))
на самом деле, мне так думается,
k[a] компилятор превращает в *(k+a)

но синтаксис, мля, ломает мои глаза и мозг!

Предположим, запись k[a],при к=0, означает “взять адрес 0 и прибавить адрес первого элемента массива”…получаем адрес первого элемента)) Тогда запись к[а] равнозначна а[к].
Неважно,одна переменная или массив,но для компилятора это первый или единственный адрес в памяти.
Короче это по сути замуты с указателями,только не через звезду,а через скобки [n].
Так же можно:

uint8_t x=5; // 
uint8_t y=10;//
Println(x[1]);
Prinln(y[-1]);

Скорей всего он выведет:
10
5
При условии,что адреса переменных будут друг за другом.

В это мне больше всего верится. Но подождем достопочтенных господ с усами :smiley:

это даже не скомпилится.

а вот это пожалуйста

  int i;
  int n;
  int j[] = {};

  i[j] = 1;   // это прокатывает
  i[n] = 1;   // а это нет

Так ради эксперимента можно перевернуть массив и посмотреть вывод.
Но думается мне что с массивом оно никак не связано. Компилятор тупо игнорит часть массива и выдает значение переменной.

void setup() {

  Serial.begin(115200);

  int a [] = {5, 4, 3, 2, 1};

  for (int k = 0; k < 5; k++) {
    Serial.print("k[");
    Serial.print(k);
    Serial.print("] = ");
    Serial.println(k[a]);
  }
}

void loop() {
}

вывод:

k[0] = 5
k[1] = 4
k[2] = 3
k[3] = 2
k[4] = 1

А вот так тоже?

с индексом ты маханул малеха

void setup() {

  Serial.begin(115200);

  int a [] = {5, 4, 3, 2, 1};

  //  for (int k = 0; k < 5; k++) {
  for (int k = 4; k >= 0; k--) {
    Serial.print("k[");
    Serial.print(k);
    Serial.print("] = ");
    Serial.println(k[a]);
  }
}

void loop() {
}

k[4] = 1
k[3] = 2
k[2] = 3
k[1] = 4
k[0] = 5

Ага :smile:

Но там всё-равно должно было быть что-то и что-то бы да вывелось…

Не скомпилится или предупреждение?

такое впечатление что WokWi есть только у меня)))


void setup() {

  Serial.begin(115200);

  uint8_t x = 5; //
  uint8_t y = 10; //
  Serial.println(x[1]);
  Serial.println(y[-1]);

}

void loop() {
}

sketch.ino: In function ‘void setup()’:
sketch.ino:8:21: error: invalid types ‘uint8_t {aka unsigned char}[int]’ for array subscript
Serial.println(x[1]);
^
sketch.ino:9:22: error: invalid types ‘uint8_t {aka unsigned char}[int]’ for array subscript
Serial.println(y[-1]);
^

Error during build: exit status 1

Точно! Вовка же есть!)) Ща изнасилуем его)

В общем, я так понял - в Си (как и в линуксе) нужно быть аккуратнее, чтобы не отстрелить свои же я…ца. :grin:

1 лайк