Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/75: Рейтинг темы: голосов - 75, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5

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

14.05.2012, 21:20. Показов 14483. Ответов 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;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2012, 21:20
Ответы с готовыми решениями:

Почему С++ так востребован?
Подскажите, почему С++ так востребован? Я думаю синтаксис удобнее у СШарп чем у С++. Да и С++ вроде бы как уже устаревший язык...

Обьясниете, почему программа В С++ так работает.
Данная программа выводит единицы и нули в шахматном порядке,10 строк и 10 столбцов. но если изменить значение, которые будут выводиться...

Почему не работает так как надо
#include &lt;vcl.h&gt; #pragma hdrstop #include &quot;Unit1.h&quot; //--------------------------------------------------------------------------- ...

29
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
14.05.2012, 21:36
Цитата Сообщение от ForwardM Посмотреть сообщение
почему нет ошибки
Потому что "от перемены мест слагаемых сумма не изменяется". Что такое arr[ i ]? Это arr + i. Так какая разница, что с чем складывать, arr+i или i+arr?
0
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
14.05.2012, 21:39  [ТС]
какая тут сумма... обращения к элементам массива
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
14.05.2012, 21:41
Цитата Сообщение от ForwardM Посмотреть сообщение
обращения к элементам массива
Ладно. Начнем издалека. Что такое arr? Это указатель на нулевой элемент массива, так? Как зная этот указатель, обратиться ко второму элементу? Случайно, не прибавив 2 к указателю на нулевой?
2
Заблокирован
14.05.2012, 21:53
Цитата Сообщение от UI Посмотреть сообщение
Начнем издалека. Что такое arr? Это указатель на нулевой элемент массива, так?
Нет. Не так. Это - массив. Который компилятор имеет право не явно приводить к типу указателя.
Но указатель на первый элемент массива, и сам массив - два принципиально разных типа данных.

В данном случае, компилятор неявно привел к типу указателя индекс массива, и сам массив
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
14.05.2012, 21:58
Лучший ответ Сообщение было отмечено как решение

Решение

Потому что arr[i] == *(arr + i), а i[arr] == *(i + arr). От перемены мест слагаемых сумма не меняется)
5
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
14.05.2012, 22:03  [ТС]
Большое спасибо!)
А как же ошибка: "i не является массивом "?
0
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
14.05.2012, 22:05  [ТС]
Правильный ответ, вроде:
arr[i] == *(arr + i), а i[arr] == *(i + arr)
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
14.05.2012, 22:09
Цитата Сообщение от ForwardM Посмотреть сообщение
А как же ошибка: "i не является массивом "?
ммм... не знаю) когда она возникает? Можете подождать знатоков, они наверняка вам объяснят всё как есть, если заглянут сюда, конечно)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.05.2012, 22:23
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от 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];
8
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
14.05.2012, 22:29
А есть ли упоминание об этом в стандарте? Возможно это зависит от компилятора.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.05.2012, 22:38
Цитата Сообщение от Toshkarik Посмотреть сообщение
А есть ли упоминание об этом в стандарте? Возможно это зависит от компилятора.
Это именно в стандарте такая гадость прописана. По поводу "зависит от компилятора" - довелось видеть один компилятор, авторы которого НЕ захотели такую идиотскую инструкцию поддерживать, но это был самопальный компилятор
2
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
14.05.2012, 22:50
Цитата Сообщение от Evg Посмотреть сообщение
/* При вычислении адреса используется та же формула a + i * sizeof (int), * но не i + a * sizeof (int). Так что правило коммутативности тут не используется * (т.к. выражения НЕ симметричны) */
хм... всегда думал, что дело в том, что a[b] ~ *(a + b*sizeof(type)), иначе не понятно, почему можно "наоборот".

Не по теме:

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

0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
14.05.2012, 22:57
Evg, получается компилятор явно проверяет, что из имени и индекса является указателем?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.05.2012, 23:33
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от gray_fox Посмотреть сообщение
иначе не понятно, почему можно "наоборот"
Потому что авторам Си такое взбрело в голову. Логики кривой конструкции я не понимаю, нормального объяснения нигде не видел. Хз может они курили, а может просто гениями были и нам их не понять

Цитата Сообщение от Toshkarik Посмотреть сообщение
Evg, получается компилятор явно проверяет, что из имени и индекса является указателем?
Да. Компилятор разрешает конструкции "указатель[целое]" и "целое[указатель]". Но не "целое[целое]" и не "указатель[указатель]". И не то чтобы "компилятор проверяет", а "так в стандарте сказано"
4
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
14.05.2012, 23:50
Цитата Сообщение от Evg Посмотреть сообщение
Хз, я как-то в Си++ не сильно разбираюсь. ...
Ну как же!?
Цитата Сообщение от Evg Посмотреть сообщение
Это именно в стандарте такая гадость прописана.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2012, 01:23
То есть суть в том что неплохо было бы, чтоб компилятор ругался при возврате по ссылке не static переменных стандартных типов?
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
15.05.2012, 01:47
Цитата Сообщение от Evg Посмотреть сообщение
Потому что авторам Си такое взбрело в голову. Логики кривой конструкции я не понимаю, нормального объяснения нигде не видел. Хз может они курили, а может просто гениями были и нам их не понять
скорее всего чтобы быть поближе к ассемблеру
когда писали язык машины были очень слабые
для х86(для 80 тоже, регистры другие)
Assembler
1
2
3
4
ax--адрес 
bx--смещение 
add ax,bx
mov dx[ax]
что соответствует
*(a + b*sizeof(type))
за ассемблеры других фирм не скажу знаю только интел
1
15.05.2012, 02:05
 Комментарий модератора 
Прекращаем оффтоп!
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.05.2012, 08:21
Вообще, по стандарту, y[x] означает *(y + x)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2012, 08:21
Помогаю со студенческими работами здесь

Почему так?
Почему так? Если я пишу в условие if(0) у меня ОПЕРАТОР_1 ИГНОРИРУЕТСЯ И ПОТОМ выполняется else!!! Ну и естественно выводится сообщение! ...

Память не может быть Read, Почему так ???
Привет всем! MyClass::MyClass(TWinControl* mOwner) { RefreshBtn = new TBitBtn(mOwner); RefreshBtn-&gt;Parent = mOwner; ...

Не работает программа. Что я делаю не так
Короче, программа нахождения суммы целых частей элементов массива, расположенных после последнего отрицательного элемента. Почему-то не...

Сравнение строк. If работает не так, как предполагается
Добрые люди) спасите и помогите. Разбила уже код как только могла. При вводе любого числа выдает ошибку, так как в процедуре...

Ф5 работает не так как должна
В общем по курсу специалисту начал учить язык Си и сразу же при первой же программе в начале были ошибки, что не мог найти файлы pdv вроде...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru