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

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

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

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

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

C++
1
2
3
int x = 5;  
0[&x] = x + x;
std::cout<<x;
Выводится 10. Чтобы мы собственно делаем во второй строчке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2013, 18:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поясните код 0[&x] (C++):

Поясните синтаксис - ( std::string& x: bar ) - C++
Наткнулся здесь на использование двоеточия для какого-то рода инициализации ссылки, но не понимаю ни синтаксиса, ни механизма работы: ...

Поясните код - C++
// ourfunc.cpp — определение собственной функции #include &lt;iostream&gt; void simon(int); // прототип функции simon() int main() { ...

Поясните код - C++
double **a = new double *;

Поясните код - C++
Скачал исходник змейки, сейчас пытаюсь разобраться в коде Вот сам код : #include &lt;iostream&gt; //стандартная библиотека #include...

поясните пожалуйста код - C++
#include &lt;iostream.h&gt; #include &lt;fstream.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;iomanip.h&gt; ...

Поясните мне код - C++
На одном из форумов нашел код. Отмечен как прикол. #include &lt;stdio.h&gt; int main() { int a = 1500080243; int b =...

24
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
11.09.2013, 11:12 #16
Цитата Сообщение от coloc Посмотреть сообщение
Kastaneda, обьясните тогда пожалуйста почему a[1] и 1[a] дают одинаковый результат?
Ответ прост - язык С позволяет писать и так и так. При этом транслятор понимает где указатель, а где индекс и генерирует правильный код для обоих случаев.

Добавлено через 1 минуту
Цитата Сообщение от Toshkarik Посмотреть сообщение
Наверно имелось ввиду, что в Вашем случае он уже увеличится на 16:
не понял, откуда 16?
Если a это указатель на int (размер которого пусть будет 4 байта), то *(а + 1 * sizeof(*a)) развернется в
*(а + 1 * 4)
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
11.09.2013, 11:14 #17
Kastaneda, a == 1000 -> a + 1 == 1004 -> a + 1 * 4 == 1016
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
11.09.2013, 11:18 #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
Kastaneda, a == 1000 -> a + 1 == 1004 -> a + 1 * 4 == 1016
все равно не понял. Я могу тупить, давай так - если a = 1000 и указывает на массив int'ов, то следующий элемент в массиве будет иметь адрес 1004. Так? Отсюда a + 1 = 1004 => a + 1*4 = 1004. Непонимаю откуда 16.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
11.09.2013, 11:20 #19
Хорошо. Будем по частям
a == 1000
a + 1 == 1004
sizeof( int ) == 4
a + 1 * 4 == a + 4 == 1016, так как 1 * 4 == 4
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,379
11.09.2013, 11:22 #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;
}
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
11.09.2013, 11:23 #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) )
А так где то читал/слышал, что этот сахар пришел из ассемблера.
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
11.09.2013, 11:26 #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 еще умножаешь?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
11.09.2013, 11:28 #23
Kastaneda, наверно, потому что я обсуждаю язык C/C++, как и все тут
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,275
Записей в блоге: 2
Завершенные тесты: 1
11.09.2013, 11:36 #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?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
11.09.2013, 11:37 #25
Kastaneda, выше же я привел ссылку на msdn. Выражение вычисляется как a + b, где 'a' это адрес а 'b' это смещение, которое и есть ( sizeof( type ) * n ). То есть как раз от перестановки ничего не меняется.

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

Как работают два цикла for ? поясните код - C++
кусочек кода :) for (int i=0; i&lt;n; i++) for (int j=i; j&lt;n; j++) if (A&gt;max) Переменная i стартует с 0, происходит проверка 0 меньше...

Поясните за код (листинг из Мюссера : Справочное руководство по STL) - C++
Добрый день. Вот код : // Demonstrating STL vector constructors with a user-defined // type and showing copying explicitly ...

Запись из одного файла в другой, поясните, почему не работает код, пожалуйста - C++
Драйжайшие господа, извольте пожалуйста взглянуть на код, и пояснить мне, почему ничего не получается; Условие следующее: Дан файл f,...

Поясните как работает код преобразования текстового представления числа в int - C++
int chToInt(char *temp) { int i = 0; int result = 0; int a; while (temp != '\0') { if (!isdigit(temp)) { result = -1; ...


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

Или воспользуйтесь поиском по форуму:
25
Yandex
Объявления
11.09.2013, 11:37
Ответ Создать тему
Опции темы

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