Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.90
ForwardM
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
#1

Почему работает и так, и так: arr[i] и i[arr]? - C++

14.05.2012, 21:20. Просмотров 5477. Ответов 29
Метки нет (Все метки)

C++
1
2
3
//один и тот же результат
cout<<arr[i];
cout<<i[arr];//почему нет ошибки
да даже это, например работает и выводит одинаковый результат
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// arrh.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <conio.h>
#include <iostream>
 
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int *arr1 =new int[7]; 
    for (int i=1; i<=7;i++)
        arr1[i]=(i+1)*10;
    
        cout<<"arr1"<<"="<<arr1[2]<<endl;
        cout<<"arr1"<<"="<<2[arr1]<<endl;
    
    getch();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
22839 / 14981 / 4306
Регистрация: 22.10.2011
Сообщений: 26,559
Записей в блоге: 4
14.05.2012, 21:36     Почему работает и так, и так: arr[i] и i[arr]? #2
Цитата Сообщение от ForwardM Посмотреть сообщение
почему нет ошибки
Потому что "от перемены мест слагаемых сумма не изменяется". Что такое arr[ i ]? Это arr + i. Так какая разница, что с чем складывать, arr+i или i+arr?
ForwardM
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
14.05.2012, 21:39  [ТС]     Почему работает и так, и так: arr[i] и i[arr]? #3
какая тут сумма... обращения к элементам массива
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
22839 / 14981 / 4306
Регистрация: 22.10.2011
Сообщений: 26,559
Записей в блоге: 4
14.05.2012, 21:41     Почему работает и так, и так: arr[i] и i[arr]? #4
Цитата Сообщение от ForwardM Посмотреть сообщение
обращения к элементам массива
Ладно. Начнем издалека. Что такое arr? Это указатель на нулевой элемент массива, так? Как зная этот указатель, обратиться ко второму элементу? Случайно, не прибавив 2 к указателю на нулевой?
Bers
Заблокирован
14.05.2012, 21:53     Почему работает и так, и так: arr[i] и i[arr]? #5
Цитата Сообщение от UI Посмотреть сообщение
Начнем издалека. Что такое arr? Это указатель на нулевой элемент массива, так?
Нет. Не так. Это - массив. Который компилятор имеет право не явно приводить к типу указателя.
Но указатель на первый элемент массива, и сам массив - два принципиально разных типа данных.

В данном случае, компилятор неявно привел к типу указателя индекс массива, и сам массив
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
14.05.2012, 21:58     Почему работает и так, и так: arr[i] и i[arr]? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Потому что arr[i] == *(arr + i), а i[arr] == *(i + arr). От перемены мест слагаемых сумма не меняется)
ForwardM
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
14.05.2012, 22:03  [ТС]     Почему работает и так, и так: arr[i] и i[arr]? #7
Большое спасибо!)
А как же ошибка: "i не является массивом "?
ForwardM
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
14.05.2012, 22:05  [ТС]     Почему работает и так, и так: arr[i] и i[arr]? #8
Правильный ответ, вроде:
arr[i] == *(arr + i), а i[arr] == *(i + arr)
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
14.05.2012, 22:09     Почему работает и так, и так: arr[i] и i[arr]? #9
Цитата Сообщение от ForwardM Посмотреть сообщение
А как же ошибка: "i не является массивом "?
ммм... не знаю) когда она возникает? Можете подождать знатоков, они наверняка вам объяснят всё как есть, если заглянут сюда, конечно)
Evg
Эксперт CАвтор FAQ
17468 / 5706 / 362
Регистрация: 30.03.2009
Сообщений: 15,661
Записей в блоге: 26
14.05.2012, 22:23     Почему работает и так, и так: arr[i] и i[arr]? #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Bers Посмотреть сообщение
Потому что Сишка и Си-пись писька - языки придуманные раздолбаями для раздолбаев.
Если откинуть эмоции, то это действительно так. Авторы языка Си почему-то решили, что можно сделать так. Логика про то, что от перестановки слагаемых сумма не меняется очень притянута за уши.

C
1
2
3
4
5
6
7
8
9
int a[10];
 
/* При вычислении адреса  используется формула a + i * sizeof (int)*/
a[i];
 
/* При вычислении адреса  используется та же формула a + i * sizeof (int),
 * но не i + a * sizeof (int). Так что правило коммутативности тут не используется
 * (т.к. выражения НЕ симметричны) */
i[a];
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.05.2012, 22:29     Почему работает и так, и так: arr[i] и i[arr]? #11
А есть ли упоминание об этом в стандарте? Возможно это зависит от компилятора.
Evg
Эксперт CАвтор FAQ
17468 / 5706 / 362
Регистрация: 30.03.2009
Сообщений: 15,661
Записей в блоге: 26
14.05.2012, 22:38     Почему работает и так, и так: arr[i] и i[arr]? #12
Цитата Сообщение от Toshkarik Посмотреть сообщение
А есть ли упоминание об этом в стандарте? Возможно это зависит от компилятора.
Это именно в стандарте такая гадость прописана. По поводу "зависит от компилятора" - довелось видеть один компилятор, авторы которого НЕ захотели такую идиотскую инструкцию поддерживать, но это был самопальный компилятор
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 3
14.05.2012, 22:50     Почему работает и так, и так: arr[i] и i[arr]? #13
Цитата Сообщение от Evg Посмотреть сообщение
/* При вычислении адреса используется та же формула a + i * sizeof (int), * но не i + a * sizeof (int). Так что правило коммутативности тут не используется * (т.к. выражения НЕ симметричны) */
хм... всегда думал, что дело в том, что a[b] ~ *(a + b*sizeof(type)), иначе не понятно, почему можно "наоборот".

Не по теме:

Цитата Сообщение от lazybiz Посмотреть сообщение
чем язык более совершенен - тем он более могуч и раздолбаней
)))

Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.05.2012, 22:57     Почему работает и так, и так: arr[i] и i[arr]? #14
Evg, получается компилятор явно проверяет, что из имени и индекса является указателем?
Evg
Эксперт CАвтор FAQ
17468 / 5706 / 362
Регистрация: 30.03.2009
Сообщений: 15,661
Записей в блоге: 26
14.05.2012, 23:33     Почему работает и так, и так: arr[i] и i[arr]? #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от gray_fox Посмотреть сообщение
иначе не понятно, почему можно "наоборот"
Потому что авторам Си такое взбрело в голову. Логики кривой конструкции я не понимаю, нормального объяснения нигде не видел. Хз может они курили, а может просто гениями были и нам их не понять

Цитата Сообщение от Toshkarik Посмотреть сообщение
Evg, получается компилятор явно проверяет, что из имени и индекса является указателем?
Да. Компилятор разрешает конструкции "указатель[целое]" и "целое[указатель]". Но не "целое[целое]" и не "указатель[указатель]". И не то чтобы "компилятор проверяет", а "так в стандарте сказано"
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
14.05.2012, 23:50     Почему работает и так, и так: arr[i] и i[arr]? #16
Цитата Сообщение от Evg Посмотреть сообщение
Хз, я как-то в Си++ не сильно разбираюсь. ...
Ну как же!?
Цитата Сообщение от Evg Посмотреть сообщение
Это именно в стандарте такая гадость прописана.
Avazart
7101 / 5278 / 267
Регистрация: 10.12.2010
Сообщений: 23,282
Записей в блоге: 17
15.05.2012, 01:23     Почему работает и так, и так: arr[i] и i[arr]? #17
То есть суть в том что неплохо было бы, чтоб компилятор ругался при возврате по ссылке не static переменных стандартных типов?
ValeryS
Модератор
6539 / 5005 / 461
Регистрация: 14.02.2011
Сообщений: 16,648
15.05.2012, 01:47     Почему работает и так, и так: arr[i] и i[arr]? #18
Цитата Сообщение от Evg Посмотреть сообщение
Потому что авторам Си такое взбрело в голову. Логики кривой конструкции я не понимаю, нормального объяснения нигде не видел. Хз может они курили, а может просто гениями были и нам их не понять
скорее всего чтобы быть поближе к ассемблеру
когда писали язык машины были очень слабые
для х86(для 80 тоже, регистры другие)
Assembler
1
2
3
4
ax--адрес 
bx--смещение 
add ax,bx
mov dx[ax]
что соответствует
*(a + b*sizeof(type))
за ассемблеры других фирм не скажу знаю только интел
Jupiter
15.05.2012, 02:05
  #19
 Комментарий модератора 
Прекращаем оффтоп!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 08:21     Почему работает и так, и так: arr[i] и i[arr]?
Еще ссылки по теме:
byte arr to int C++
C++ Найти длину массива arr[]
C++ Не ожиданный результат, указатель на char arr[]
Двумерный массив передать через **arr C++
почему это так работает C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.05.2012, 08:21     Почему работает и так, и так: arr[i] и i[arr]? #20
Вообще, по стандарту, y[x] означает *(y + x)
Yandex
Объявления
15.05.2012, 08:21     Почему работает и так, и так: arr[i] и i[arr]?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru