2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 C / C++ загадки (ненамеренные)
Сообщение23.12.2005, 03:00 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Я было начал в другой теме, но решил открыть отдельную тему.

1) Вопрос - законно ли выражение? Если да, то в какой ситуации и каков результат, а если нет, то почему?

  • c = a +=+ b
  • c = a +++ b
  • c = a ++++ b
  • c = a +++++ b
  • c = a +++=+++ b
  • a = i+++i
  • a = (i++)+(++i)
  • a = i+++++i
  • ++i+=+i++
  • a = i!=!i
  • a = i&&&i
  • a = i&*&*&*&*&*&i
  • a = i?i?i?i?i?i:i:i:i:i:i

2) printf("%d %d %d\n", i++, i++, i++); печатает 2 2 2. Почему? Законно ли это? Что на самом деле следует ожидать?

Любители подобных головоломок организовали конкурс: International Obfuscated С Contest. А в помощь изучающим C написан iFAQ.

 Профиль  
                  
 
 
Сообщение24.12.2005, 00:43 


27/11/05
183
Северодонецк
Большинство предложенных примеров на тему: лексемой языка C считается самая длинная
последовательность символов, совпадающая с изображением лексемы. Поэтому, например,
последовательность +++++ эквивалентна трем лексемам ++,++ и +.

Ну а ошибка трансляции связана с нарушением принципа l-value (i++ = 9). Цепочка i&*&*&*&*&*&i за счет нейтрализации операций *& (можно привести как аналог - нейтрализация интеграла и дифференциала) превратится в i &i.

Печать в printf справедлива в случае оптимизации компилятором вычисления выражения i++, но может быть совершенно другой для других компиляторов. Ну, а если возникает трудность в трактовке семантики оператора, всегда можно воспользоваться помощью смешанного листинга (ASM + SRC).

Вот только вопрос:
кто может гарантировать, что данный компилятор выполняет все требования соответствующего стандарта?

 Профиль  
                  
 
 
Сообщение24.12.2005, 02:41 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Вы, конечно правы, хотя следует добавить еще и приоритеты операций.

Вообще говоря, правильность реализации компилятора гарантировать никто не может. Поэтому их (компиляторы) и тестируют.

Есть и другой вопрос: "ответ в случае оптимизации" А законна ли такая оптимизация? Компилятор сгенерировал что-то. А это что-то правильно - или насекомое в компиляторе? О котором надо сообщить разработчикам.

То есть я предпочитаю проверять текст на соответствие стандарту. И знать, где используемый мной компилятор стандарту (описанию языка) не соответствует.

Например, чтобы далеко не ходить: какой вариант языков С и С++ реализует Visual Studio? GCC дает четкий исчерпывающий ответ.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group