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 лайк
te238s
17.Август.2023 10:19:59
3
BOOM:
Ничего не перепутал?
Да нее,я кажись суть понимаю. Это очевидно,зная нюансы языка и представления различных типов данных. Но пока промолчу)
BOOM:
Ничего не перепутал?
а ты попробуй и удивись как и я…
1 лайк
BOOM
17.Август.2023 10:22:28
5
Я ж не гусар (даже усов не имею)…
суть данного явления мне понятна, не понятно как, с точки зрения синтаксиса, это пропускает компилятор?
или для него любая переменная, массив с нулевым индексом?
add
гусарам можно говорить)))
1 лайк
BOOM
17.Август.2023 10:29:33
7
У любой переменной есть адрес, обращение к переменной всегда идет по адресу (у любого массива начало - это адрес первого элемента) и это сходство, а вот что дальше происходит в твоем примере - я понятия не имею
дальше, переменная превращается в массив, а массив в индекс )))
на самом деле, мне так думается,
k[a] компилятор превращает в *(k+a)
но синтаксис, мля, ломает мои глаза и мозг!
te238s
17.Август.2023 10:42:35
9
Предположим, запись k[a],при к=0, означает “взять адрес 0 и прибавить адрес первого элемента массива”…получаем адрес первого элемента)) Тогда запись к[а] равнозначна а[к].
Неважно,одна переменная или массив,но для компилятора это первый или единственный адрес в памяти.
Короче это по сути замуты с указателями,только не через звезду,а через скобки [n].
Так же можно:
uint8_t x=5; //
uint8_t y=10;//
Println(x[1]);
Prinln(y[-1]);
Скорей всего он выведет:
10
5
При условии,что адреса переменных будут друг за другом.
BOOM
17.Август.2023 10:46:55
10
В это мне больше всего верится. Но подождем достопочтенных господ с усами
te238s:
Скорей всего он выведет:
это даже не скомпилится.
а вот это пожалуйста
int i;
int n;
int j[] = {};
i[j] = 1; // это прокатывает
i[n] = 1; // а это нет
nevkon
17.Август.2023 10:54:58
12
Так ради эксперимента можно перевернуть массив и посмотреть вывод.
Но думается мне что с массивом оно никак не связано. Компилятор тупо игнорит часть массива и выдает значение переменной.
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
BOOM
17.Август.2023 11:07:57
16
xDriver:
маханул малеха
Ага
Но там всё-равно должно было быть что-то и что-то бы да вывелось…
te238s
17.Август.2023 11:15:22
17
xDriver:
te238s:
Скорей всего он выведет:
это даже не скомпилится.
Не скомпилится или предупреждение?
te238s:
Не скомпилится
такое впечатление что 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
te238s
17.Август.2023 11:21:46
19
Точно! Вовка же есть!)) Ща изнасилуем его)
BOOM
17.Август.2023 11:41:16
20
В общем, я так понял - в Си (как и в линуксе) нужно быть аккуратнее, чтобы не отстрелить свои же я…ца.
1 лайк