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

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

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

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

10.09.2013, 18:39. Просмотров 1375. Ответов 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 =...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
агерон
268 / 267 / 33
Регистрация: 12.10.2009
Сообщений: 1,060
10.09.2013, 18:44 #2
0[&x] = &x[0] что значит взяли адрес переменной, представили его как массив из элементов типа переменной x и в нулевой элемент этого массива присвоили значение x+x, хотя вся эта белиберда заменяется оператором x*=2; что расшифровываться как "взять значение переменной x, умножить его на 2 и записать результат обратно в переменную x"
1
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
10.09.2013, 19:16 #3
0[&x] = x + x;
Мне это напоминает вот такое обращение к элементам массива

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

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

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

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

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

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

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

0[&x] = x + x;

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

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

Добавлено через 4 минуты
... но ее можно рассматривать как массив
0
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
10.09.2013, 19:17 #4
gore-lykovoe, по сути оператор [] это синтаксический сахар, который интерпретируется как
C++
1
2
int a[4];
a[1] еквивалентно *( a + 1 )
а как известно от перестановки результат не меняется.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
10.09.2013, 21:49 #5
Цитата Сообщение от coloc Посмотреть сообщение
a[1] еквивалентно *( a + 1 )
что на самом деле превращается в *(а + 1 * sizeof(*a)), поэтому в данном случае
Цитата Сообщение от coloc Посмотреть сообщение
от перестановки результат не меняется.
меняется.
1
coloc
погромист
410 / 246 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
10.09.2013, 21:58 #6
Kastaneda, обьясните тогда пожалуйста почему a[1] и 1[a] дают одинаковый результат?
0
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
11.09.2013, 09:52 #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
что на самом деле превращается в *(а + 1 * sizeof(*a)), поэтому в данном случае

меняется.
Нет. Адресная арифметика в C (и в С++) устроена так, что a[1] == *(a + 1).
0
zer0mail
2334 / 1960 / 192
Регистрация: 03.07.2012
Сообщений: 7,033
Записей в блоге: 1
11.09.2013, 09:57 #8
Цитата Сообщение от CheshireCat Посмотреть сообщение
Нет. Адресная арифметика в C (и в С++) устроена так, что a[1] == *(a + 1).
Да неужели? И что означает единица справа?
0
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
11.09.2013, 10:03 #9
Ага, вот сюрприз! Открой учебник по Си(++).
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
11.09.2013, 10:12 #10

Не по теме:

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


___
0
zer0mail
2334 / 1960 / 192
Регистрация: 03.07.2012
Сообщений: 7,033
Записей в блоге: 1
11.09.2013, 10:29 #11
Цитата Сообщение от CheshireCat Посмотреть сообщение
Ага, вот сюрприз! Открой учебник по Си(++).
Сам открой и увидишь, что если "a" массив целых по 4 байта и &a[0]=1000, то &a[1] будет не 1001, а 1004
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
11.09.2013, 10:31 #12
zer0mail, эм, ( a + 1 ) тоже будет 1004, про это и шла речь...
0
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
11.09.2013, 10:46 #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
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
11.09.2013, 11:09 #14
CheshireCat, ну так о чем и речь
Цитата Сообщение от CheshireCat Посмотреть сообщение
a=0x22fd40 a+1=0x22fd44
указатель увеличился на 4, а не на 1.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
11.09.2013, 11:11 #15
Наверно имелось ввиду, что в Вашем случае он уже увеличится на 16:
Цитата Сообщение от Kastaneda Посмотреть сообщение
*(а + 1 * sizeof(*a))
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 11:11
Привет! Вот еще темы с ответами:

Как работают два цикла 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; ...


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

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

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