Форум программистов, компьютерный форум CyberForum.ru

Поясните код 0[&x] - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
10.09.2013, 18:39     Поясните код 0[&x] #1
C++
1
2
3
int x = 5;  
0[&x] = x + x;
std::cout<<x;
Выводится 10. Чтобы мы собственно делаем во второй строчке?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
агерон
 Аватар для агерон
265 / 264 / 33
Регистрация: 12.10.2009
Сообщений: 1,030
10.09.2013, 18:44     Поясните код 0[&x] #2
0[&x] = &x[0] что значит взяли адрес переменной, представили его как массив из элементов типа переменной x и в нулевой элемент этого массива присвоили значение x+x, хотя вся эта белиберда заменяется оператором x*=2; что расшифровываться как "взять значение переменной x, умножить его на 2 и записать результат обратно в переменную x"
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
10.09.2013, 19:16     Поясните код 0[&x] #3
0[&x] = x + x;
Мне это напоминает вот такое обращение к элементам массива

Обычное обращение к элементу:
int a[10];

a[0] = 1; // адрес[номер_элемента]

Т.е. в нормальном виде сначала пишем имя массива (как известно имя массива - это адрес его первого элемента) и в квадратных скобках номер элемента.

// -------------------------------------------------------------

Так же доступ к любому элементу можно получить в другом (необычном) виде:

0[a] = 1; // номер_элемента[адрес]

Тут все наоборот. Сначала указывается номер элемента а в скобках имя массива

0[&x] = x + x;

0 - это номер_элемента в "массиве"
&x - это собственно адрес "массива"

Конечно, переменная x это не массив

Добавлено через 4 минуты
... но ее можно рассматривать как массив
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
10.09.2013, 19:17     Поясните код 0[&x] #4
gore-lykovoe, по сути оператор [] это синтаксический сахар, который интерпретируется как
C++
1
2
int a[4];
a[1] еквивалентно *( a + 1 )
а как известно от перестановки результат не меняется.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.09.2013, 21:49     Поясните код 0[&x] #5
Цитата Сообщение от coloc Посмотреть сообщение
a[1] еквивалентно *( a + 1 )
что на самом деле превращается в *(а + 1 * sizeof(*a)), поэтому в данном случае
Цитата Сообщение от coloc Посмотреть сообщение
от перестановки результат не меняется.
меняется.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
10.09.2013, 21:58     Поясните код 0[&x] #6
Kastaneda, обьясните тогда пожалуйста почему a[1] и 1[a] дают одинаковый результат?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.09.2013, 09:52     Поясните код 0[&x] #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
что на самом деле превращается в *(а + 1 * sizeof(*a)), поэтому в данном случае

меняется.
Нет. Адресная арифметика в C (и в С++) устроена так, что a[1] == *(a + 1).
zer0mail
2176 / 1859 / 187
Регистрация: 03.07.2012
Сообщений: 6,616
Записей в блоге: 1
11.09.2013, 09:57     Поясните код 0[&x] #8
Цитата Сообщение от CheshireCat Посмотреть сообщение
Нет. Адресная арифметика в C (и в С++) устроена так, что a[1] == *(a + 1).
Да неужели? И что означает единица справа?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.09.2013, 10:03     Поясните код 0[&x] #9
Ага, вот сюрприз! Открой учебник по Си(++).
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5437 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
11.09.2013, 10:12     Поясните код 0[&x] #10

Не по теме:

Цитата Сообщение от CheshireCat Посмотреть сообщение
Си(+_+)


___
zer0mail
2176 / 1859 / 187
Регистрация: 03.07.2012
Сообщений: 6,616
Записей в блоге: 1
11.09.2013, 10:29     Поясните код 0[&x] #11
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ага, вот сюрприз! Открой учебник по Си(++).
Сам открой и увидишь, что если "a" массив целых по 4 байта и &a[0]=1000, то &a[1] будет не 1001, а 1004
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.09.2013, 10:31     Поясните код 0[&x] #12
zer0mail, эм, ( a + 1 ) тоже будет 1004, про это и шла речь...
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.09.2013, 10:46     Поясните код 0[&x] #13
Практика - лучший критерий любой теории, не так ли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
    int a[100] = {0, 1, 2};
    cout << "a[1]=" << a[1] << "\t\t *(a+1)=" << *(a+1) << endl;
    cout << "a=" << a << "\t a+1=" << a+1 << endl;
    cout << "1[a]=" << 1[a] << "\t\t *(1+a)=" << *(1+a) << endl;
    cout << "&1[a]=" << &1[a] << "\t 1+a=" << 1+a << endl;
 
    return 0;
}
a[1]=1 *(a+1)=1
a=0x22fd40 a+1=0x22fd44
1[a]=1 *(1+a)=1
&1[a]=0x22fd44 1+a=0x22fd44
GCC 4.7.1
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.09.2013, 11:09     Поясните код 0[&x] #14
CheshireCat, ну так о чем и речь
Цитата Сообщение от CheshireCat Посмотреть сообщение
a=0x22fd40 a+1=0x22fd44
указатель увеличился на 4, а не на 1.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.09.2013, 11:11     Поясните код 0[&x] #15
Наверно имелось ввиду, что в Вашем случае он уже увеличится на 16:
Цитата Сообщение от Kastaneda Посмотреть сообщение
*(а + 1 * sizeof(*a))
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.09.2013, 11:12     Поясните код 0[&x] #16
Цитата Сообщение от coloc Посмотреть сообщение
Kastaneda, обьясните тогда пожалуйста почему a[1] и 1[a] дают одинаковый результат?
Ответ прост - язык С позволяет писать и так и так. При этом транслятор понимает где указатель, а где индекс и генерирует правильный код для обоих случаев.

Добавлено через 1 минуту
Цитата Сообщение от Toshkarik Посмотреть сообщение
Наверно имелось ввиду, что в Вашем случае он уже увеличится на 16:
не понял, откуда 16?
Если a это указатель на int (размер которого пусть будет 4 байта), то *(а + 1 * sizeof(*a)) развернется в
*(а + 1 * 4)
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.09.2013, 11:14     Поясните код 0[&x] #17
Kastaneda, a == 1000 -> a + 1 == 1004 -> a + 1 * 4 == 1016
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.09.2013, 11:18     Поясните код 0[&x] #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
Kastaneda, a == 1000 -> a + 1 == 1004 -> a + 1 * 4 == 1016
все равно не понял. Я могу тупить, давай так - если a = 1000 и указывает на массив int'ов, то следующий элемент в массиве будет иметь адрес 1004. Так? Отсюда a + 1 = 1004 => a + 1*4 = 1004. Непонимаю откуда 16.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
11.09.2013, 11:20     Поясните код 0[&x] #19
Хорошо. Будем по частям
a == 1000
a + 1 == 1004
sizeof( int ) == 4
a + 1 * 4 == a + 4 == 1016, так как 1 * 4 == 4
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 11:22     Поясните код 0[&x]
Еще ссылки по теме:

Поясните синтаксис - ( std::string& x: bar ) C++
C++ Как работают два цикла for ? поясните код
Friend ostream& operator<<(ostream& stream, CArr& obj); C++

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

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
11.09.2013, 11:22     Поясните код 0[&x] #20
Адресная арифметика так устроена.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int a[100] = {0, 1, 2};
 
    // a[1] еквивалентно *( a + 1 )
    // что на самом деле превращается в *(а + 1 * sizeof(*a))
 
    // Дискуссия об адресной арифметике началась с этого утверждения.
    // Проверим его истинность:
 
    cout << "*(a+1)=" << *(a+1) << "   a+1=" << a+1 << endl;
    cout << "*(а+1*sizeof(*a))=" << *(a+1*sizeof(*a)) << "   a+1*sizeof(*a)=" << a+1*sizeof(*a) << endl;
 
    return 0;
}
Yandex
Объявления
11.09.2013, 11:22     Поясните код 0[&x]
Ответ Создать тему
Опции темы

Текущее время: 08:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru