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

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

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

It is alive! - C++

15.05.2010, 12:50. Просмотров 3302. Ответов 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
ForEveR
В астрале
Эксперт С++
7989 / 4748 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
17.08.2010, 03:12 #31
Я конечно все понимаю.. Но по-моему позволять так писать нельзя.

C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main()
{
    int i=0; 
    std::cout<< ((--(++(++(++(++(--(++(--i))))))))++)?((++i)++):i-- <<'\n';
        return 0;
}
0
fasked
Эксперт С++
4971 / 2551 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.08.2010, 03:16  [ТС] #32
Цитата Сообщение от Lavroff Посмотреть сообщение
Я конечно все понимаю.. Но по-моему позволять так писать нельзя.
так не пиши
и другим не позволяй!
0
Aaxenon
Light Knight
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
17.08.2010, 14:22 #33
i[10] == 10[i]
0
neske
1516 / 883 / 89
Регистрация: 26.03.2010
Сообщений: 3,023
17.08.2010, 18:08 #34
я восхищен ; D
0
Nick Alte
Эксперт С++
1645 / 1017 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
17.08.2010, 19:19 #35
Это старый прикол из Си: array[index] означает то же самое, что index[array]

Добавлено через 1 минуту
:slowpoke:
0
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
17.08.2010, 20:26 #36
Интересно,что программа,скорре всего,вылетит при таком коде
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main ()
{
   int i = 89767;
   char c = i["1q96g"];
   std::cout << c << std::endl;
}
Значит,где-то в отделе констант создаётся константный массив-строка,а обращение 89767["1q96g"] означает обратиться к элементу 89767 массива "1q96g",и программа вылетает. Я правильно понял?
0
Lord_Voodoo
Супер-модератор
8601 / 2221 / 61
Регистрация: 07.03.2007
Сообщений: 10,785
Завершенные тесты: 1
17.08.2010, 20:31 #37
#pragma, в code block работает, но возвращает пустоту)))
а так:
C
1
2
3
4
5
6
7
int main ()
{
   int i = 89767;
   int c = i["1q96g"];
   std::cout << "c:" << c << std::endl;
   return 1;
}
0

если я не ошибаюсь, в с/с++ контроля за памятью не ведется, разве что система не даст доступа:
C
1
2
3
4
5
6
7
8
9
#include <iostream>
 
int main ()
{
 int mas[0];
 mas[6] = 9;
 std::cout << mas[6];
 return 0;
}
1
#pragma
Временно недоступен
955 / 226 / 6
Регистрация: 12.04.2009
Сообщений: 921
17.08.2010, 20:33 #38
Не,у меня этот код тоже segfault выдаёт)
0
Lord_Voodoo
Супер-модератор
8601 / 2221 / 61
Регистрация: 07.03.2007
Сообщений: 10,785
Завершенные тесты: 1
17.08.2010, 20:38 #39
вот скрин, чтобы не быть голословным... при этом обращение к 100 элементу вызывало ошибку
1
Миниатюры
It is alive!  
fasked
Эксперт С++
4971 / 2551 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.08.2010, 21:02  [ТС] #40
Цитата Сообщение от #pragma Посмотреть сообщение
у меня этот код тоже segfault выдаёт
segmentation fault. значит ты попадаешь в раздел памяти "только для чтения". кто-то попадает в доступную для записи область.
1
ForEveR
В астрале
Эксперт С++
7989 / 4748 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.08.2010, 22:57 #41
Из разряда трындеца. Много букв, но интересно. Особенно интересно это запустить

Analogliterals
0
Mencey
148 / 95 / 7
Регистрация: 22.07.2010
Сообщений: 426
19.08.2010, 23:40 #42
Вот что думает по этому поводу справочник по C:

Из справочника по C
Индексное выражение задает элемент массива и имеет вид:

выражение-1 [ выражение-2 ]

Тип индексного выражения является типом элементов массива, а значение представляет величину, адрес которой вычисляется с помощью значений выражение-1 и выражение-2.

Обычно выражение-1 - это указатель, например, идентификатор массива, а выражение-2 - это целая величина. Однако требуется только, чтобы одно из выражений было указателем, а второе целочисленной величиной. Поэтому выражение-1 может быть целочисленной величиной, а выражение-2 указателем. В любом случае выражение-2 должно быть заключено в квадратные скобки. Хотя индексное выражение обычно используется для ссылок на элементы массива, тем не менее индекс может появляться с любым указателем.

Индексные выражения для ссылки на элементы одномерного массива вычисляются путем сложения целой величины со значениями указателя с последующим применением к результату операции разадресации (*).

Так как одно из выражений, указанных в индексном выражении, является указателем, то при сложении используются правила адресной арифметики, согласно которым целая величина преобразуется к адресному представлению, путем умножения ее на размер типа, адресуемого указателем. Пусть, например, идентификатор arr объявлен как массив элементов типа double.

double arr[10];

Таким образом, чтобы получить доступ к i-тому элементу массива arr можно написать аrr[i], что, в силу сказанного выше, эквивалентно i[a]. При этом величина i умножается на размер типа double и представляет собой адрес i-го элемента массива arr от его начала. Затем это значение складывается со значением указателя arr, что в свою очередь дает адрес i-го элемента массива. К полученному адресу применяется операция разадресации, т.е. осуществляется выборка элемента массива arr по сформированному адресу.

Таким образом, результатом индексного выражения arr[i] (или i[arr]) является значение i-го элемента массива.



Кстати в книгах по assembler'у на эту тему я тоже что то читал там(в Assembler'e) выражение:
mov ax, bx[5]
эквивалентно:
mov ax, bx + 5

только какоето меньше весит другое быстрее выполняется!
1
emum
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 1
09.11.2014, 05:09 #43
работает в силу коммутативности:
A[i] это *(A+i), учитывая что от перемены мест слагаемых сумма не изменяется, то это будет *(i+A), что в свою очередь тождественно в наешм случае i[A]
0
09.11.2014, 05:09
Ответ Создать тему
Опции темы

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