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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
#1

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

10.09.2013, 18:39. Просмотров 1303. Ответов 24
Метки нет (Все метки)

C++
1
2
3
int x = 5;  
0[&x] = x + x;
std::cout<<x;
Выводится 10. Чтобы мы собственно делаем во второй строчке?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
11.09.2013, 11:23     Поясните код 0[&x] #21
Вот кстати описание оператора мелкомягкими: http://msdn.microsoft.com/en-us/library/th52k9c8.aspx
In the preceding example, the expression nArray[2] is identical to 2[nArray]. The reason is that the result of a subscript expression e1[ e2 ] is given by:
*( (e2) + (e1) )
А так где то читал/слышал, что этот сахар пришел из ассемблера.
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
11.09.2013, 11:26     Поясните код 0[&x] #22
Цитата Сообщение от CheshireCat Посмотреть сообщение
Адресная арифметика так устроена.
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;
}
я имел ввиду, что sizeof(*a) добавляется на уровне ассемблера, на уровне языка С/С++ кончено же этого нет.

Добавлено через 19 секунд
Toshkarik, все равно не понял, зачем ты 4 на 4 еще умножаешь?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
11.09.2013, 11:28     Поясните код 0[&x] #23
Kastaneda, наверно, потому что я обсуждаю язык C/C++, как и все тут
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
11.09.2013, 11:36     Поясните код 0[&x] #24
Все началось с фразы "от перестановки слагаемых сумма не меняется". Вот что я имел ввиду:
допустим имеем int *ptr, обращаемся к 11му элементу двумя способами ptr[10] и 10[ptr]. Разворачиваем первую запись
*(ptr + 10 * sizeof(int));
допустим ptr = 1000, тогда вычисляя это выражение получим 1000 + 40 = 1040; теперь разворачиваем вторую запись согласно логике *(a + b) == *(b + a)
*(10 + ptr * sizeof(int));
вычисляем 10 + 1000 * 4 = 4010, что != 1040.
А работает это помому что во втором случае тоже получится
*(ptr + 10 * sizeof(int));
т.е. компилятор понимает что куда подставить и никакой "перестановки слогаемых" нет.

Добавлено через 3 минуты
Цитата Сообщение от Toshkarik Посмотреть сообщение
Kastaneda, наверно, потому что я обсуждаю язык C/C++, как и все тут
Запись *(a + 1) подразумевает обращение ко 2му (или по индексу 1) элементу, так? Если а = 1000 и мы имеем дело с интами, то адрес второго элемента будет 1004, так? Откуда 16?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 11:37     Поясните код 0[&x]
Еще ссылки по теме:

Почему в выражении нельзя использовать запятую вместо && C++
Поясните за код (листинг из Мюссера : Справочное руководство по STL) C++
Нюансы синтаксиса: где, как и для чего используется && C++
C++ Порядок вычисления: операторы «|» и «||», «&» и «&&»
Поясните код C++

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

Или воспользуйтесь поиском по форуму:
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
11.09.2013, 11:37     Поясните код 0[&x] #25
Kastaneda, выше же я привел ссылку на msdn. Выражение вычисляется как a + b, где 'a' это адрес а 'b' это смещение, которое и есть ( sizeof( type ) * n ). То есть как раз от перестановки ничего не меняется.

Цитата Сообщение от Kastaneda Посмотреть сообщение
Запись *(a + 1) подразумевает обращение ко 2му (или по индексу 1) элементу, так? Если а = 1000 и мы имеем дело с интами, то адрес второго элемента будет 1004, так? Откуда 16?
Вам уже давали пример Выше, на который Вы уже ответили.
Yandex
Объявления
11.09.2013, 11:37     Поясните код 0[&x]
Ответ Создать тему
Опции темы

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