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

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

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

Author24 — интернет-сервис помощи студентам
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2012, 21:20
Ответы с готовыми решениями:

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

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

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

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

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

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

Не по теме:

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

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

Решение

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

Цитата Сообщение от Toshkarik Посмотреть сообщение
Evg, получается компилятор явно проверяет, что из имени и индекса является указателем?
Да. Компилятор разрешает конструкции "указатель[целое]" и "целое[указатель]". Но не "целое[целое]" и не "указатель[указатель]". И не то чтобы "компилятор проверяет", а "так в стандарте сказано"
4
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
14.05.2012, 23:50 16
Цитата Сообщение от Evg Посмотреть сообщение
Хз, я как-то в Си++ не сильно разбираюсь. ...
Ну как же!?
Цитата Сообщение от Evg Посмотреть сообщение
Это именно в стандарте такая гадость прописана.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.05.2012, 01:23 17
То есть суть в том что неплохо было бы, чтоб компилятор ругался при возврате по ссылке не static переменных стандартных типов?
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
15.05.2012, 01:47 18
Цитата Сообщение от Evg Посмотреть сообщение
Потому что авторам Си такое взбрело в голову. Логики кривой конструкции я не понимаю, нормального объяснения нигде не видел. Хз может они курили, а может просто гениями были и нам их не понять
скорее всего чтобы быть поближе к ассемблеру
когда писали язык машины были очень слабые
для х86(для 80 тоже, регистры другие)
Assembler
1
2
3
4
ax--адрес 
bx--смещение 
add ax,bx
mov dx[ax]
что соответствует
*(a + b*sizeof(type))
за ассемблеры других фирм не скажу знаю только интел
1
Jupiter
15.05.2012, 02:05
  #19
 Комментарий модератора 
Прекращаем оффтоп!
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
15.05.2012, 08:21 20
Вообще, по стандарту, y[x] означает *(y + x)
2
15.05.2012, 08:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2012, 08:21
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru