32 / 32 / 3
Регистрация: 04.04.2010
Сообщений: 414
1

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

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

C++
1
2
3
int x = 5;  
0[&x] = x + x;
std::cout<<x;
Выводится 10. Чтобы мы собственно делаем во второй строчке?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2013, 18:39
Ответы с готовыми решениями:

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

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

поясните код
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;stack&gt; using namespace std; int main() { ...

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

24
1179 / 892 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.09.2013, 11:23 21
Вот кстати описание оператора мелкомягкими: http://msdn.microsoft.com/en-u... 2k9c8.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
5224 / 3196 / 362
Регистрация: 12.12.2009
Сообщений: 8,101
Записей в блоге: 2
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
1179 / 892 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.09.2013, 11:28 23
Kastaneda, наверно, потому что я обсуждаю язык C/C++, как и все тут
0
5224 / 3196 / 362
Регистрация: 12.12.2009
Сообщений: 8,101
Записей в блоге: 2
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
1179 / 892 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
11.09.2013, 11:37 25
Kastaneda, выше же я привел ссылку на msdn. Выражение вычисляется как a + b, где 'a' это адрес а 'b' это смещение, которое и есть ( sizeof( type ) * n ). То есть как раз от перестановки ничего не меняется.

Цитата Сообщение от Kastaneda Посмотреть сообщение
Запись *(a + 1) подразумевает обращение ко 2му (или по индексу 1) элементу, так? Если а = 1000 и мы имеем дело с интами, то адрес второго элемента будет 1004, так? Откуда 16?
Вам уже давали пример Выше, на который Вы уже ответили.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2013, 11:37
Помогаю со студенческими работами здесь

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

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

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

Поясните код генератор слов из телефонного кода
Взял решение задачи Дейтела с форума Напишите программу на С++, которая для данного семизначного...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru