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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.65
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

It is alive! - C++

15.05.2010, 12:50. Просмотров 3264. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос It is alive! (C++):

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

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

HTTP GET-запрос и keep-alive - C++
Есть HTTP keep-alive соединение. Через него надо сделать серию GET-запросов. Со стороны клиента это можно сделать двумя путями: 1)...

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

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

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

HTTP GET-запрос и keep-alive - C++
Есть HTTP keep-alive соединение. Через него надо сделать серию GET-запросов. Со стороны клиента это можно сделать двумя путями: 1)...

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

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

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

HTTP GET-запрос и keep-alive - C++
Есть HTTP keep-alive соединение. Через него надо сделать серию GET-запросов. Со стороны клиента это можно сделать двумя путями: 1)...

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

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

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

HTTP GET-запрос и keep-alive - C++
Есть HTTP keep-alive соединение. Через него надо сделать серию GET-запросов. Со стороны клиента это можно сделать двумя путями: 1)...

Keep-Alive соеди

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

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

HTTP GET-запрос и keep-alive - C++
Есть HTTP keep-alive соединение. Через него надо сделать серию GET-запросов. Со стороны клиента это можно сделать двумя путями: 1)...

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


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

Или воспользуйтесь поиском по форуму:
42
Psixodelik
40 / 39 / 2
Регистрация: 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Эксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
15.05.2010, 13:00 #3
fasked, тоже пока ничего не понял, но прикольно!
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 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Эксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
15.05.2010, 13:05 #5
Цитата Сообщение от Psixodelik Посмотреть сообщение
из из массива i
из какого массива? i объявлена, как переменная типа int, содержащая 32 битное число, а не указатель на строку символов.
Сама по себе запись
C++
1
char c = i["1q96g"];
странная...
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 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 / 2
Регистрация: 27.11.2009
Сообщений: 100
15.05.2010, 13:10 #7
Но блин...оно же работает

Добавлено через 1 минуту
А если не секрет, отуда откопал? Или просто решил опыты на компиляторе ставить? xD
0
Adler
78 / 78 / 3
Регистрация: 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Эксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
15.05.2010, 13:11 #9
Я думал - думал, я всё понял!
По сути к 4 прибавляется адрес строки "1q96g". В результате в переменной i уже адрес строки плюс её (переменной) начальное значение.
2
MikeSoft
Эксперт С++
3802 / 1778 / 85
Регистрация: 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Эксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
15.05.2010, 13:19 #11
не заметил сразу пост, повторился.
Добавлено через 1 минуту
MiCr0s0fT, Вы просто немного не поняли. Попробуйте i присвоить 2 вместо 4, а строку вообще не трогайте.
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 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
Эксперт С++
3802 / 1778 / 85
Регистрация: 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Эксперт С++
9694 / 5644 / 962
Регистрация: 25.07.2009
Сообщений: 10,848
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
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
15.05.2010, 13:38  [ТС] #15
Цитата Сообщение от easybudda Посмотреть сообщение
то есть, я так понимаю, оператор [] требует наличие указателя и целого числа, а что из них с чем складывать - действительно не важно...
Это из серии "Как сделать свой код абсолютно безумным"
0
15.05.2010, 13:38
Ответ Создать тему
Опции темы

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