Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

14.05.2012, 21:20. Просмотров 5780. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2012, 21:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему работает и так, и так: arr[i] и i[arr]? (C++):

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

Множественное наследование - так ли это плохо? - C++
Вопрос не в том, что это такое и пр. С момента изучения Си++ во всех книжках все авторы (кроме самого Страуструпа) пишут, что множественное...

OpenGL что не так в коде? вроде все нормально - C++
Собственно вот код, я сижу под убунтой 9.10 и он ругаеться пишет #include&lt;GL/glut.h&gt; int N = 3; int n = 0; int x; int y; ...

Мусорное значение в динамическом массиве в структуре. Что я делаю не так? - C++
Здравствуйте! Делаю вычисление факториала от 21 до 30. Использую длинную арифметику. Произведение длинного и короткого чисел -...

Как сделать так чтобы простейшая программа запускалась сначало - C++
Предположим есть самая простая программа: #include &lt;iostream&gt; using namespace std; #include &lt;cmath&gt; int main() { double c; ...

Баг или так задумано? Фишка с кодировкой файлов компиляции - C++
Visual C++ 2013 Express. От изменения кодировки созданных .cpp файлов будет зависеть то как выводятся русские буквы. Никогда раньше не...

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

В данном случае, компилятор неявно привел к типу указателя индекс массива, и сам массив
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
14.05.2012, 21:58 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Потому что arr[i] == *(arr + i), а i[arr] == *(i + arr). От перемены мест слагаемых сумма не меняется)
5
ForwardM
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
14.05.2012, 22:03  [ТС] #7
Большое спасибо!)
А как же ошибка: "i не является массивом "?
0
ForwardM
1 / 1 / 0
Регистрация: 14.05.2012
Сообщений: 5
14.05.2012, 22:05  [ТС] #8
Правильный ответ, вроде:
arr[i] == *(arr + i), а i[arr] == *(i + arr)
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
14.05.2012, 22:09 #9
Цитата Сообщение от ForwardM Посмотреть сообщение
А как же ошибка: "i не является массивом "?
ммм... не знаю) когда она возникает? Можете подождать знатоков, они наверняка вам объяснят всё как есть, если заглянут сюда, конечно)
0
Evg
Эксперт CАвтор FAQ
18374 / 6421 / 441
Регистрация: 30.03.2009
Сообщений: 17,813
Записей в блоге: 28
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
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
14.05.2012, 22:29 #11
А есть ли упоминание об этом в стандарте? Возможно это зависит от компилятора.
0
Evg
Эксперт CАвтор FAQ
18374 / 6421 / 441
Регистрация: 30.03.2009
Сообщений: 17,813
Записей в блоге: 28
14.05.2012, 22:38 #12
Цитата Сообщение от Toshkarik Посмотреть сообщение
А есть ли упоминание об этом в стандарте? Возможно это зависит от компилятора.
Это именно в стандарте такая гадость прописана. По поводу "зависит от компилятора" - довелось видеть один компилятор, авторы которого НЕ захотели такую идиотскую инструкцию поддерживать, но это был самопальный компилятор
2
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
14.05.2012, 22:50 #13
Цитата Сообщение от Evg Посмотреть сообщение
/* При вычислении адреса используется та же формула a + i * sizeof (int), * но не i + a * sizeof (int). Так что правило коммутативности тут не используется * (т.к. выражения НЕ симметричны) */
хм... всегда думал, что дело в том, что a[b] ~ *(a + b*sizeof(type)), иначе не понятно, почему можно "наоборот".

Не по теме:

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

0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
14.05.2012, 22:57 #14
Evg, получается компилятор явно проверяет, что из имени и индекса является указателем?
0
Evg
Эксперт CАвтор FAQ
18374 / 6421 / 441
Регистрация: 30.03.2009
Сообщений: 17,813
Записей в блоге: 28
14.05.2012, 23:33 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от gray_fox Посмотреть сообщение
иначе не понятно, почему можно "наоборот"
Потому что авторам Си такое взбрело в голову. Логики кривой конструкции я не понимаю, нормального объяснения нигде не видел. Хз может они курили, а может просто гениями были и нам их не понять

Цитата Сообщение от Toshkarik Посмотреть сообщение
Evg, получается компилятор явно проверяет, что из имени и индекса является указателем?
Да. Компилятор разрешает конструкции "указатель[целое]" и "целое[указатель]". Но не "целое[целое]" и не "указатель[указатель]". И не то чтобы "компилятор проверяет", а "так в стандарте сказано"
4
14.05.2012, 23:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2012, 23:33
Привет! Вот еще темы с ответами:

Выручите сделайте данное задание так-как я в с++ не очень силен - C++
1 задание: В матриці В знайти суму елементів, що лежать вище головної діагоналі.(Изображение матрицы загрузил матрица В) 2 задание:...

Как сделать так, чтобы в окне, созданом OpenGL, рисовали 2 потока? - C++
Вот не знаю, где создать тему, с одной стороны это надо в разделе OpenGL, с другой стороны- там чисто художники, а здесь именно...

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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