2014 dxdy logo

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

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




 
 C / C++ загадки (ненамеренные)
Сообщение23.12.2005, 03:00 
Аватара пользователя
: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 
Большинство предложенных примеров на тему: лексемой языка C считается самая длинная
последовательность символов, совпадающая с изображением лексемы. Поэтому, например,
последовательность +++++ эквивалентна трем лексемам ++,++ и +.

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

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

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

 
 
 
 
Сообщение24.12.2005, 02:41 
Аватара пользователя
:evil:
Вы, конечно правы, хотя следует добавить еще и приоритеты операций.

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

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

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

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

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group