1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
|
|||||||||||
1 | |||||||||||
Почему работает и так, и так: arr[i] и i[arr]?14.05.2012, 21:20. Показов 13438. Ответов 29
Метки нет (Все метки)
0
|
14.05.2012, 21:20 | |
Ответы с готовыми решениями:
29
Почему С++ так востребован? Обьясниете, почему программа В С++ так работает. Почему не работает так как надо Почему так? |
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
|
|
14.05.2012, 21:39 [ТС] | 3 |
какая тут сумма... обращения к элементам массива
1
|
Супер-модератор
|
|
14.05.2012, 21:41 | 4 |
Ладно. Начнем издалека. Что такое arr? Это указатель на нулевой элемент массива, так? Как зная этот указатель, обратиться ко второму элементу? Случайно, не прибавив 2 к указателю на нулевой?
2
|
Заблокирован
|
|
14.05.2012, 21:53 | 5 |
Нет. Не так. Это - массив. Который компилятор имеет право не явно приводить к типу указателя.
Но указатель на первый элемент массива, и сам массив - два принципиально разных типа данных. В данном случае, компилятор неявно привел к типу указателя индекс массива, и сам массив
1
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
14.05.2012, 21:58 | 6 |
Сообщение было отмечено как решение
Решение
Потому что arr[i] == *(arr + i), а i[arr] == *(i + arr). От перемены мест слагаемых сумма не меняется)
5
|
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
|
|
14.05.2012, 22:03 [ТС] | 7 |
Большое спасибо!)
А как же ошибка: "i не является массивом "?
0
|
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
|
|
14.05.2012, 22:05 [ТС] | 8 |
Правильный ответ, вроде:
arr[i] == *(arr + i), а i[arr] == *(i + arr)
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
14.05.2012, 22:09 | 9 |
ммм... не знаю) когда она возникает? Можете подождать знатоков, они наверняка вам объяснят всё как есть, если заглянут сюда, конечно)
0
|
14.05.2012, 22:23 | 10 | |||||
Сообщение было отмечено как решение
Решение
Если откинуть эмоции, то это действительно так. Авторы языка Си почему-то решили, что можно сделать так. Логика про то, что от перестановки слагаемых сумма не меняется очень притянута за уши.
8
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
14.05.2012, 22:29 | 11 |
А есть ли упоминание об этом в стандарте? Возможно это зависит от компилятора.
0
|
14.05.2012, 22:38 | 12 |
Это именно в стандарте такая гадость прописана. По поводу "зависит от компилятора" - довелось видеть один компилятор, авторы которого НЕ захотели такую идиотскую инструкцию поддерживать, но это был самопальный компилятор
2
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
14.05.2012, 22:50 | 13 |
хм... всегда думал, что дело в том, что a[b] ~ *(a + b*sizeof(type)), иначе не понятно, почему можно "наоборот".
0
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
|
14.05.2012, 22:57 | 14 |
Evg, получается компилятор явно проверяет, что из имени и индекса является указателем?
0
|
14.05.2012, 23:33 | 15 |
Сообщение было отмечено как решение
Решение
Потому что авторам Си такое взбрело в голову. Логики кривой конструкции я не понимаю, нормального объяснения нигде не видел. Хз может они курили, а может просто гениями были и нам их не понять
Да. Компилятор разрешает конструкции "указатель[целое]" и "целое[указатель]". Но не "целое[целое]" и не "указатель[указатель]". И не то чтобы "компилятор проверяет", а "так в стандарте сказано"
4
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
||||||
15.05.2012, 01:47 | 18 | |||||
скорее всего чтобы быть поближе к ассемблеру
когда писали язык машины были очень слабые для х86(для 80 тоже, регистры другие)
*(a + b*sizeof(type)) за ассемблеры других фирм не скажу знаю только интел
1
|
Jupiter
|
||||||
15.05.2012, 02:05
#19
|
||||||
0
|
Higher
|
|
15.05.2012, 08:21 | 20 |
Вообще, по стандарту, y[x] означает *(y + x)
2
|
15.05.2012, 08:21 | |
15.05.2012, 08:21 | |
Помогаю со студенческими работами здесь
20
Память не может быть Read, Почему так ??? Не работает программа. Что я делаю не так Сравнение строк. If работает не так, как предполагается Ф5 работает не так как должна Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |