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

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

14.05.2012, 21:20. Показов 14980. Ответов 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
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
15.05.2012, 08:37  [ТС]
Студворк — интернет-сервис помощи студентам
Всем большое спасибо.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.05.2012, 08:49

Не по теме:

Цитата Сообщение от lazybiz Посмотреть сообщение
Ну как же!?
Данный момент (декомпозиция массива) был унаследован из языка Си, в стандарте которого я более-менее разбираюсь. Дальше речь пошла о ссылках, которые есть только в Си++. И в этом я разбираюсь плохо, хотя немного пораскинув мозгами пришёл к выводу: Возвращение ссылки на локальный объект



Цитата Сообщение от ValeryS Посмотреть сообщение
Assembler
1
2
3
4
ax--адрес 
bx--смещение 
add ax,bx
mov dx[ax]
что соответствует
*(a + b*sizeof(type))
Только в твоём ассемблерном фрагменте нету sizeof'а

Цитата Сообщение от diagon Посмотреть сообщение
Вообще, по стандарту, y[x] означает *(y + x)
Только если копать дальше, то *(y + x) при переходе в абсолютные значения адресов означает чтение из адреса y + x * sizeof(*y)
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,878
15.05.2012, 18:45
Цитата Сообщение от Evg Посмотреть сообщение
Только в твоём ассемблерном фрагменте нету sizeof'а
разумеется нет это же так пример
для char смешение bx
для short add bx,bx
для int add ebx,ebx add ebx,ebx
тоже самое сдвигами
в 32 разрадном вообще лафа
C++
1
2
3
lea edx,[eax+ebx]
lea edx,[eax+ebx*2]
lea edx,[eax+ebx*4]
вообще то я хотел показать
что
Assembler
1
2
add ax,bx
mov dx,[ax]
и
Assembler
1
2
add bx,ax
mov dx,[bx]
это одно и тоже
из за слабости компиляторов это и перешло в С(мое мнение)
а потом не стали убирать для совместимости
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.05.2012, 19:18
Цитата Сообщение от Evg Посмотреть сообщение
Только если копать дальше, то *(y + x) при переходе в абсолютные значения адресов означает чтение из адреса y + x * sizeof(*y)
Необязательно.
C++
1
2
3
4
int *a;
int b;
*(a + b); 
*(b + a);
Зависит от того, что суммируется. Если указатель с целым, как в моем примере, то формула будет
[указатель] + [целое] * sizeof( *[указатель] );
2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
15.05.2012, 19:56
Цитата Сообщение от ValeryS Посмотреть сообщение
в 32 разрадном вообще лафа
C++
1
2
3
lea edx,[eax+ebx]
lea edx,[eax+ebx*2]
lea edx,[eax+ebx*4]
Ну очевидно же, что это НЕ коммутативно относительно eax и ebx

Цитата Сообщение от ValeryS Посмотреть сообщение
вообще то я хотел показать
что
Assembler
1
2
add ax,bx
mov dx,[ax]
и
Assembler
1
2
add bx,ax
mov dx,[bx]
это одно и тоже
Одно и то же только в случае указателя на char

Цитата Сообщение от ValeryS Посмотреть сообщение
из за слабости компиляторов это и перешло в С(мое мнение)
а потом не стали убирать для совместимости
Наврядли. Поддержать оптимально такую конструкцию - это мизерная правка в компиляторе. Другое дело, что у куривших было ассемблерное мышление, а потому такую хрень внесли в язык. Т.е. причина с точностью до наоборот

Цитата Сообщение от diagon Посмотреть сообщение
Необязательно
Блин, реально даже логично получается...
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
16.05.2012, 00:56
О чем спорим, парни!?
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
20.12.2012, 18:38
Цитата Сообщение от Bers Посмотреть сообщение
Нет. Не так. Это - массив. Который компилятор имеет право не явно приводить к типу указателя
Нет. arr - это массив, реализуемый с помощью указателя. Именно так. О том, что это массив знают люди и sizeof, в остальных случаях это указатель. Мало того,
C++
1
2
3
int *p;
int i;
p[i] /* i-й элемент массива, на который указывает p, таким образом, указатель на массив и на его нулевой элемент - одно и тоже*/
.

Добавлено через 2 минуты
Например,
C++
1
2
3
4
int a[30];
    int *p;
    p=&a[4];
    p[3]=16;//16 присваивается седьмому элементу a
.

Добавлено через 39 минут
Цитата Сообщение от Evg Посмотреть сообщение
/* При вычислении адреса *используется формула a + i * sizeof (int)*/
a[i];
/* При вычислении адреса *используется та же формула a + i * sizeof (int),
** но не i + a * sizeof (int). Так что правило коммутативности тут не используется
** (т.к. выражения НЕ симметричны) */
Нет. То, что на низком уровне есть умножение, ничего не значит, формула здесь a+i безо всяких * sizeof (int). Да, само сложение перегружено на сложение не со слагаемым, а с его произведением на sizeof. Но это внутри оператора, а не в выражении. И некоммутативность здесь не причём, асимметрия суммы проистекает из разнотипности слагаемых: указатель и size_t. От их переставновки приходим просо к другой операции, которая перегружена прямо противоположным образом. Но если так и написать i+a, то выглядит это как обычная сумма чисел и от перестановки результат меняться не должен. Он и не меняется. Но скобки - это другой синтаксис и как сложение они не выглядят.

Добавлено через 3 минуты
В случае скобок это снижает читабельность, так как не говорит о том, где здесь индекс, а где указатель. Другое дело сумма с указателем, там адресная арифметика.

Добавлено через 1 минуту
И там не имеет значения где что.
0
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 16:17
Цитата Сообщение от taras atavin Посмотреть сообщение
arr - это массив, реализуемый с помощью указателя

расскажи-ка, пожалуйста, как массив (т.е. область памяти) можно "реализовать" указателем?

Добавлено через 2 часа 57 минут
1. Массив данных -- это область памяти, в которой хранятся данные.
2. Указатель на данные -- это область памяти, в которой хранится адрес, по которому можно найти данные.

То, что имя массива данных легко неявно конвертируется в указатель на данные, конечно, запутывает новичков. Но когда тебе говорят, что ты не прав и говорят, что это разные вещи, то не надо спорить, надо мотать на ус.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
22.12.2012, 16:47
Цитата Сообщение от UI Посмотреть сообщение
Потому что "от перемены мест слагаемых сумма не изменяется". Что такое arr[ i ]? Это arr + i. Так какая разница, что с чем складывать, arr+i или i+arr?
Цитата Сообщение от diagon Посмотреть сообщение
Вообще, по стандарту, y[x] означает *(y + x)
Ну и в продолжение можно сказать, что к элементам двумерного массива можно обращаться так:

C
1
2
3
4
5
6
7
int x[3][3];
int i;
int j;
 
...
/* эквиdалентно a = x[j][i] */
a = i[j[x]];
1
118 / 80 / 1
Регистрация: 10.08.2011
Сообщений: 664
22.12.2012, 16:50
Цитата Сообщение от UI Посмотреть сообщение
Потому что "от перемены мест слагаемых сумма не изменяется". Что такое arr[ i ]? Это arr + i. Так какая разница, что с чем складывать, arr+i или i+arr?
лол зашквар )))



я помню даже такое правило в С++ синтаксис описания массива верен в обоих случаях. Просто так реализовано.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2012, 16:50

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru