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

It is alive! - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.65
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 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

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,309
15.05.2010, 21:29     It is alive! #21
fasked, это самая тривиальная адресная арифметика. Компилятору совершенно фиолетово, с какой стороны стоит индекс, а с какой - адрес строки. Поэтому записи
C++
1
2
3
4
5
const char p = "1q96g";
const char c0 = p[i];
const char c1 = i["1q96g"];
const char c2 = "1q96g"[i];
const char c3 = i[p];
с точки зрения компилятора абсолютно эквивалентны, хотя и непривычны человеческому глазу. Можешь, кстати, этим сокровенным знанием щегольнуть где-нибудь на собеседовании/экзамене, хе-хе :-)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.05.2010, 21:33  [ТС]     It is alive! #22
Цитата Сообщение от CheshireCat Посмотреть сообщение
Можешь, кстати, этим сокровенным знанием щегольнуть где-нибудь на собеседовании/экзамене, хе-хе :-)
Мы об этом как раз говорим =)
Цитата Сообщение от M128K145 Посмотреть сообщение
Подобные задания обычно осложнены битовыми операциями, и в результате выписать промежуточные результаты
результат то, как я понимаю, все равно неопределенный
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
17.08.2010, 01:35     It is alive! #23
Например, есть код:
C++
1
2
int a [] = {1, 2, 3, 4};
int i = 3;
Запись a[i] труктуется как *(a + i), но *(a + i) == *(i + a), что в свою очередь эквивалентно i [a].
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.08.2010, 01:43  [ТС]     It is alive! #24
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Запись a[i] труктуется как
ничего здесь не труктуется. это маразм.
не надо путать синтаксис языка и адресную арифметику. такой синтаксис маразм, но забавный
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
17.08.2010, 02:13     It is alive! #25
То, что я написал и есть пример адресной арифметики. Это преобразовывается (можно сказать, что трактуется) в один и тот же ассемблерный код.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.08.2010, 02:31  [ТС]     It is alive! #26
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
То, что я написал и есть пример адресной арифметики. Это преобразовывается (можно сказать, что трактуется) в один и тот же ассемблерный код.
при чем здесь во что это преобразовывается, мы говорим о синтаксисе языка!

я имею в виду, что можно и таких зверей создавать. и в этом тоже в некоторой степени вина синтаксиса

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
   static int val = 1;
   while(val /* vanish */ --> 0)
   {
      (++ /* do black magic ! */  val) /* very black magic !!! */ ++;
      (val == 2 ? printf("WTF ??!") : val =- 1);
   }
 
   return ((!!val==!!0)?val ==- 100500?5:1:main());
}
easybudda
17.08.2010, 02:34
  #27

Не по теме:

Цитата Сообщение от fasked Посмотреть сообщение
(!!val==!!0)
смешно

fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.08.2010, 02:36  [ТС]     It is alive! #28
Цитата Сообщение от easybudda Посмотреть сообщение
смешно
а это между прочим приведение к bool целых чисел !!!
надо было вот так написать:
C++
1
return ((!!val==!!false)?val ==- 100500?5:1:main());
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.08.2010, 02:40     It is alive! #29
Продолжение банкета... Про синтаксис.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
   static int val = 1;
   while(val /* vanish */ --> 0)
   {
      (++ /* do black magic ! */  val) /* very black magic !!! */ ++;
      (val == 2 ? printf("WTF ??!") : val =- 1);
   }
 
   if(val<-15)
       return ((1<0?/* magic */100500:500?233?33?321?2223?0:0:0:0:0:0));
 
   return ((!!val==!!false)?val ==- 100500?5:1:main());
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.08.2010, 02:53  [ТС]     It is alive! #30
а вот еще идиотизм синтаксиса. конструкция switch-while-case.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
void foo(char c) { printf("%x\n", c); }
int main()
{
   char c = 0xF; int i = 1;
   switch(c&3) 
      while((c-=4)>=0) 
      {
         foo(c>>i++); case 3:
         foo(c>>i++); case 2:
         foo(c>>i++); case 1:
         foo(c>>i++); case 0:
         i = 0;
      }
 
   return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.08.2010, 03:12     It is alive! #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;
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.08.2010, 03:16  [ТС]     It is alive! #32
Цитата Сообщение от Lavroff Посмотреть сообщение
Я конечно все понимаю.. Но по-моему позволять так писать нельзя.
так не пиши
и другим не позволяй!
Aaxenon
Light Knight
 Аватар для Aaxenon
106 / 29 / 3
Регистрация: 03.06.2010
Сообщений: 361
17.08.2010, 14:22     It is alive! #33
i[10] == 10[i]
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
17.08.2010, 18:08     It is alive! #34
я восхищен ; D
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
17.08.2010, 19:19     It is alive! #35
Это старый прикол из Си: array[index] означает то же самое, что index[array]

Добавлено через 1 минуту
:slowpoke:
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
17.08.2010, 20:26     It is alive! #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",и программа вылетает. Я правильно понял?
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,839
Завершенные тесты: 1
17.08.2010, 20:31     It is alive! #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;
}
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
17.08.2010, 20:33     It is alive! #38
Не,у меня этот код тоже segfault выдаёт)
Lord_Voodoo
Супер-модератор
 Аватар для Lord_Voodoo
8505 / 2172 / 61
Регистрация: 07.03.2007
Сообщений: 10,839
Завершенные тесты: 1
17.08.2010, 20:38     It is alive! #39
вот скрин, чтобы не быть голословным... при этом обращение к 100 элементу вызывало ошибку
Миниатюры
It is alive!  
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.08.2010, 21:02  [ТС]     It is alive! #40
Цитата Сообщение от #pragma Посмотреть сообщение
у меня этот код тоже segfault выдаёт
segmentation fault. значит ты попадаешь в раздел памяти "только для чтения". кто-то попадает в доступную для записи область.
Yandex
Объявления
17.08.2010, 21:02     It is alive!
Ответ Создать тему
Опции темы

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