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

It is alive! - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.65
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.05.2010, 12:50     It is alive! #1
Как?! Как это может быть?!
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 зависит какой собственно символ выберется из строки. Но я совершенно не понимаю КАК это работает!?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2010, 12:50     It is alive!
Посмотрите здесь:

Alive maze. Alpha version
keep-alive в Qt C++ Qt
C++ HTTP GET-запрос и keep-alive

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Psixodelik
 Аватар для Psixodelik
38 / 37 / 2
Регистрация: 27.11.2009
Сообщений: 93
15.05.2010, 12:59     It is alive! #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 элемент*/"]
Следовательно на выходе будет с
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.05.2010, 13:00     It is alive! #3
fasked, тоже пока ничего не понял, но прикольно!
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.05.2010, 13:04  [ТС]     It is alive! #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;
}
но не наоборот же. все таки индекс массива обычно заносится в скобки, все с ног на голову
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.05.2010, 13:05     It is alive! #5
Цитата Сообщение от Psixodelik Посмотреть сообщение
из из массива i
из какого массива? i объявлена, как переменная типа int, содержащая 32 битное число, а не указатель на строку символов.
Сама по себе запись
C++
1
char c = i["1q96g"];
странная...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.05.2010, 13:07  [ТС]     It is alive! #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;
}
Psixodelik
 Аватар для Psixodelik
38 / 37 / 2
Регистрация: 27.11.2009
Сообщений: 93
15.05.2010, 13:10     It is alive! #7
Но блин...оно же работает

Добавлено через 1 минуту
А если не секрет, отуда откопал? Или просто решил опыты на компиляторе ставить? xD
Adler
 Аватар для Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
15.05.2010, 13:10     It is alive! #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)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.05.2010, 13:11     It is alive! #9
Я думал - думал, я всё понял!
По сути к 4 прибавляется адрес строки "1q96g". В результате в переменной i уже адрес строки плюс её (переменной) начальное значение.
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3781 / 1765 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
15.05.2010, 13:13     It is alive! #10
fasked, отладчик чуть проясняет суть:
1. обьявляется переменная i = 4
2. обьявляется переменная с, которая должна хранить в себе значение, которое содержится в i[index]
3. index равен строке, из которой берётся только последний символ (надо же получить int). Поэтому i["g"] = 0x67
4. она и присваивается в с

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

Весьма интересный пример...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.05.2010, 13:19     It is alive! #11
не заметил сразу пост, повторился.
Добавлено через 1 минуту
MiCr0s0fT, Вы просто немного не поняли. Попробуйте i присвоить 2 вместо 4, а строку вообще не трогайте.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.05.2010, 13:19  [ТС]     It is alive! #12
Цитата Сообщение от easybudda Посмотреть сообщение
Я думал - думал, я всё понял!
По сути к 4 прибавляется адрес строки "1q96g". В результате в переменной i уже адрес строки плюс её (переменной) начальное значение.
то есть логичнее было бы так???
C++
1
2
int i = 1;
char c = i + *("qwerty");
логичнее не с точки зрения как таковой логики, а просто ради объяснения слов xD

непонятно только почему значения в такой конструкции должны складываться, может все таки и правда не важно в какой части должен быть массив, а в какой его индекс...
MikeSoft
Эксперт C++
 Аватар для MikeSoft
3781 / 1765 / 85
Регистрация: 21.11.2009
Сообщений: 2,540
15.05.2010, 13:26     It is alive! #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"
Фантастика.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.05.2010, 13:27     It is alive! #14
Цитата Сообщение от fasked Посмотреть сообщение
может все таки и правда не важно в какой части должен быть массив, а в какой его индекс...
Вот и я так думаю. При этом конструкция вроде
C
1
2
int a = 4;
int b = a[2];
уже не срабатывает - говорит
Код
error: subscripted value is neither array nor pointer
то есть, я так понимаю, оператор [] требует наличие указателя и целого числа, а что из них с чем складывать - действительно не важно...
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.05.2010, 13:38  [ТС]     It is alive! #15
Цитата Сообщение от easybudda Посмотреть сообщение
то есть, я так понимаю, оператор [] требует наличие указателя и целого числа, а что из них с чем складывать - действительно не важно...
Это из серии "Как сделать свой код абсолютно безумным"
easybudda
15.05.2010, 13:40
  #16

Не по теме:

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

Psixodelik
 Аватар для Psixodelik
38 / 37 / 2
Регистрация: 27.11.2009
Сообщений: 93
15.05.2010, 13:43     It is alive! #17
Цитата Сообщение от easybudda Посмотреть сообщение

Не по теме:


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

Скажи практическую пользу от такого и может кому нибудь да сделаю
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.05.2010, 14:19  [ТС]     It is alive! #18
Цитата Сообщение от Psixodelik Посмотреть сообщение
Скажи практическую пользу от такого и может кому нибудь да сделаю
Практическая польза от такого знания.. хм.. разве что "Никогда так не делать!"
Хотя вполне возможно, что когда-то и пригодится. слышал, что на собеседованиях часто задают вопросы по типу: "что произойдет при записи i+++++i"
Alip
53 / 32 / 3
Регистрация: 10.03.2010
Сообщений: 85
15.05.2010, 14:23     It is alive! #19
Действительно забавная штука
Новый взгляд на оператор [].
Попробовал две конструкции
C++
1
2
int a = 4;
int b = a[a];
и
C++
1
2
int a = 4;
int b = a[&a];
Работает только вторая. На первую ругается. Похоже easybudda прав. Действительно для массива нужен указатель и целое, а где их поставить неважно.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
15.05.2010, 21:11     It is alive! #20
Цитата Сообщение от fasked Посмотреть сообщение
"что произойдет при записи i+++++i"
Подобные задания обычно осложнены битовыми операциями, и в результате выписать промежуточные результаты
Yandex
Объявления
15.05.2010, 21:11     It is alive!
Ответ Создать тему
Опции темы

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