Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
fasked
Эксперт С++
4984 / 2563 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
1

It is alive!

15.05.2010, 12:50. Просмотров 3413. Ответов 42
Метки нет (Все метки)

Как?! Как это может быть?!
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main ()
{
   int i = 4;
   char c = i["1q96g"];
   std::cout << c << std::endl;
}
Я понял как это функционирует: от значения переменной i зависит какой собственно символ выберется из строки. Но я совершенно не понимаю КАК это работает!?
10
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2010, 12:50
Ответы с готовыми решениями:

keep-alive в Qt
Нарыл код простейшего однопоточного http-сервера. main: #include &lt;QCoreApplication&gt; #include...

HttpClient не работает Keep-Alive
Всем привет. Для запросов использую следующий метод: using (var client = new...

HTTP GET-запрос и keep-alive
Есть HTTP keep-alive соединение. Через него надо сделать серию GET-запросов. Со стороны клиента это...

Keep-Alive соединение и Cookie
Доброго времени суток, товарищи программисты. Столкнулся с такой вот ситуацией: При попытке...

wiznet vs keep alive, как это работает???
Здравствуйте, заранее извиняюсь если тема не в той ветке или уже обсуждалась. ( но я никак не могу...


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

Или воспользуйтесь поиском по форуму:
42
Psixodelik
40 / 39 / 5
Регистрация: 27.11.2009
Сообщений: 100
15.05.2010, 12:59 2
Хммм...ну как я понял то так:

1) задал значение i;
2) создал чаровскую переменную(которая содержит один символ)
3) из из массива i["sdfdgfdf"] в чаровскую переменную заносишь i-тый элемент массива

К примеру:

C++
1
2
int i=2;
char c = i["a/*0 элемент*/b/*1 элементc/*2 элемент*/d/*3 элемент*/"]
Следовательно на выходе будет с
0
easybudda
Модератор
Эксперт CЭксперт С++
10152 / 6058 / 1523
Регистрация: 25.07.2009
Сообщений: 11,481
15.05.2010, 13:00 3
fasked, тоже пока ничего не понял, но прикольно!
0
fasked
Эксперт С++
4984 / 2563 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.05.2010, 13:04  [ТС] 4
Psixodelik, логичнее было бы в таком случае писать вот так:
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main ()
{
   int i = 1;
   char c = "qwrewqr"[i];
   std::cout << c << std::endl;
}
но не наоборот же. все таки индекс массива обычно заносится в скобки, все с ног на голову
0
easybudda
Модератор
Эксперт CЭксперт С++
10152 / 6058 / 1523
Регистрация: 25.07.2009
Сообщений: 11,481
15.05.2010, 13:05 5
Цитата Сообщение от Psixodelik Посмотреть сообщение
из из массива i
из какого массива? i объявлена, как переменная типа int, содержащая 32 битное число, а не указатель на строку символов.
Сама по себе запись
C++
1
char c = i["1q96g"];
странная...
0
fasked
Эксперт С++
4984 / 2563 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.05.2010, 13:07  [ТС] 6
хотя вот эксперименты показывают, что компилятору пофигу с какой стороны массив, а с какой индекс:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main ()
{
   int i = 1;
   int a[] = { 1, 2, 3 };
   int c = i[a];
   std::cout << c << std::endl;
}
0
Psixodelik
40 / 39 / 5
Регистрация: 27.11.2009
Сообщений: 100
15.05.2010, 13:10 7
Но блин...оно же работает

Добавлено через 1 минуту
А если не секрет, отуда откопал? Или просто решил опыты на компиляторе ставить? xD
0
Adler
79 / 79 / 19
Регистрация: 07.05.2009
Сообщений: 316
15.05.2010, 13:10 8
ну как бы это
C++
1
2
3
4
5
6
  char c = i["12345"];
  /*
    00A46796  mov         eax,dword ptr [i] 
    00A46799  mov         cl,byte ptr string "a" (0A5FB38h)[eax] 
    00A4679F  mov         byte ptr [c],cl 
  */
и это
C++
1
2
3
4
5
6
  char c = "12345"[i];
  /*
    01326796  mov         eax,dword ptr [i] 
    01326799  mov         cl,byte ptr string "a" (133FB38h)[eax] 
    0132679F  mov         byte ptr [c],cl 
  */
генерирует один и тот же машинный код. Странно, но похоже у int'а есть operator[](char* s)
2
easybudda
Модератор
Эксперт CЭксперт С++
10152 / 6058 / 1523
Регистрация: 25.07.2009
Сообщений: 11,481
15.05.2010, 13:11 9
Я думал - думал, я всё понял!
По сути к 4 прибавляется адрес строки "1q96g". В результате в переменной i уже адрес строки плюс её (переменной) начальное значение.
2
MikeSoft
Эксперт С++
3920 / 1785 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
15.05.2010, 13:13 10
fasked, отладчик чуть проясняет суть:
1. обьявляется переменная i = 4
2. обьявляется переменная с, которая должна хранить в себе значение, которое содержится в i[index]
3. index равен строке, из которой берётся только последний символ (надо же получить int). Поэтому i["g"] = 0x67
4. она и присваивается в с

НО! Очень интересно, что за магический набор "----g".
Попробуйте ввести меньше, чем четыре символа перед g ... получается 0

Весьма интересный пример...
0
easybudda
Модератор
Эксперт CЭксперт С++
10152 / 6058 / 1523
Регистрация: 25.07.2009
Сообщений: 11,481
15.05.2010, 13:19 11
не заметил сразу пост, повторился.
Добавлено через 1 минуту
MiCr0s0fT, Вы просто немного не поняли. Попробуйте i присвоить 2 вместо 4, а строку вообще не трогайте.
0
fasked
Эксперт С++
4984 / 2563 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.05.2010, 13:19  [ТС] 12
Цитата Сообщение от easybudda Посмотреть сообщение
Я думал - думал, я всё понял!
По сути к 4 прибавляется адрес строки "1q96g". В результате в переменной i уже адрес строки плюс её (переменной) начальное значение.
то есть логичнее было бы так???
C++
1
2
int i = 1;
char c = i + *("qwerty");
логичнее не с точки зрения как таковой логики, а просто ради объяснения слов xD

непонятно только почему значения в такой конструкции должны складываться, может все таки и правда не важно в какой части должен быть массив, а в какой его индекс...
0
MikeSoft
Эксперт С++
3920 / 1785 / 183
Регистрация: 21.11.2009
Сообщений: 2,540
15.05.2010, 13:26 13
easybudda, действительно немного не так понял...

так это ж вообще чудеса:
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main ()
{
     int i = 3;
     char c = i["qwert"];
     std::cout << c << std::endl;
}
И изменяя i получаем любую позицию из строки "qwert"
Фантастика.
0
easybudda
Модератор
Эксперт CЭксперт С++
10152 / 6058 / 1523
Регистрация: 25.07.2009
Сообщений: 11,481
15.05.2010, 13:27 14
Цитата Сообщение от fasked Посмотреть сообщение
может все таки и правда не важно в какой части должен быть массив, а в какой его индекс...
Вот и я так думаю. При этом конструкция вроде
C
1
2
int a = 4;
int b = a[2];
уже не срабатывает - говорит
Код
error: subscripted value is neither array nor pointer
то есть, я так понимаю, оператор [] требует наличие указателя и целого числа, а что из них с чем складывать - действительно не важно...
0
fasked
Эксперт С++
4984 / 2563 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.05.2010, 13:38  [ТС] 15
Цитата Сообщение от easybudda Посмотреть сообщение
то есть, я так понимаю, оператор [] требует наличие указателя и целого числа, а что из них с чем складывать - действительно не важно...
Это из серии "Как сделать свой код абсолютно безумным"
0
easybudda
15.05.2010, 13:40
  #16

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
Это из серии "Как сделать свой код абсолютно безумным"
Ага... Надо почаще студентам в програмки такие фортели вставлять, чтобы преподы с ума сходили... :D

2
Psixodelik
40 / 39 / 5
Регистрация: 27.11.2009
Сообщений: 100
15.05.2010, 13:43 17
Цитата Сообщение от easybudda Посмотреть сообщение

Не по теме:


Ага... Надо почаще студентам в програмки такие фортели вставлять, чтобы преподы с ума сходили... :D

Скажи практическую пользу от такого и может кому нибудь да сделаю
0
fasked
Эксперт С++
4984 / 2563 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.05.2010, 14:19  [ТС] 18
Цитата Сообщение от Psixodelik Посмотреть сообщение
Скажи практическую пользу от такого и может кому нибудь да сделаю
Практическая польза от такого знания.. хм.. разве что "Никогда так не делать!"
Хотя вполне возможно, что когда-то и пригодится. слышал, что на собеседованиях часто задают вопросы по типу: "что произойдет при записи i+++++i"
0
Alip
55 / 34 / 12
Регистрация: 10.03.2010
Сообщений: 85
15.05.2010, 14:23 19
Действительно забавная штука
Новый взгляд на оператор [].
Попробовал две конструкции
C++
1
2
int a = 4;
int b = a[a];
и
C++
1
2
int a = 4;
int b = a[&a];
Работает только вторая. На первую ругается. Похоже easybudda прав. Действительно для массива нужен указатель и целое, а где их поставить неважно.
0
M128K145
Эксперт JavaЭксперт С++
8327 / 3548 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
15.05.2010, 21:11 20
Цитата Сообщение от fasked Посмотреть сообщение
"что произойдет при записи i+++++i"
Подобные задания обычно осложнены битовыми операциями, и в результате выписать промежуточные результаты
0
15.05.2010, 21:11
Ответ Создать тему
Опции темы

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