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

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

14.05.2012, 21:20. Показов 14364. Ответов 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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 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
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 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
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2012, 01:23
То есть суть в том что неплохо было бы, чтоб компилятор ругался при возврате по ссылке не static переменных стандартных типов?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru