OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 17:56

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: C++, очередной сюрприз
СообщениеДобавлено: Вторник, 05 Январь, 2010 22:51 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
Оказывается С++ поддерживает двойные неравенства в роли условных выражений. :lol: Сегодня увидел. Скомпилируйте
Код:
#include <iostream>

int main (int argc, char* const argv[])
{
   int value = 1;
   
   if (0 <= value <= 5)
    std::cout << "value in [0, 5] \n";
   if (6 <= value <= 13)
    std::cout << "value in [6, 13] \n";
   if (13 <= value <= 26)
    std::cout << "value in [13, 26] \n";
   if (26 <= value <= 34)
    std::cout << "value in [26, 34] \n";
  return 0;
}

И насладитесь ответом. :twisted:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Вторник, 05 Январь, 2010 23:16 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
kemiisto писал(а):
Оказывается С++ поддерживает двойные неравенства в роли условных выражений. :lol:
Не вижу в таких неравенствах ничего смешного, и уж тем более ничего плохого. По сути это сокращённая запись конъюнкции двух условий:
Код:
 (0 <= value) & (value <= 5)
Это не только экономит место, но и делает текст программы более наглядным, так как математическую нотацию условных выражений все мы "всосали" ещё в школе :) .

Кстати, пример удачного сокращения можно найти и в Обероне. Сравните:
Код:
 ARRAY N1, N2 OF CHAR;
ARRAY N1 OF ARRAY N2 OF CHAR;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Вторник, 05 Январь, 2010 23:18 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
igor, да Вы скомпилируйте и запустите. Будете удивлены. :wink:

Цитата:
По сути это сокращённая запись конъюнкции двух условий

Вы и правда так думаете? :D Скомпилируйте, прошу Вас.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Вторник, 05 Январь, 2010 23:27 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
kemiisto писал(а):
Скомпилируйте, прошу Вас.
К сожалению (или к счастью :) ), я не практикую программирование на C++. У меня даже нет подходящего компилятора.
Интрига сохраняется :) .

PS: Даже если все другие языки программирования вдруг исчезнут, то и в этом случае я не стану программировать на C++. Адептов C++ прошу не принимать близко к сердцу. На всякий случай сообщаю, что "воспитывать" меня бесполезно :) .


Последний раз редактировалось igor Вторник, 05 Январь, 2010 23:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Вторник, 05 Январь, 2010 23:30 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
igor, вот держите вывод. Будьте любезны. :D
Код:
value in [0, 5]
value in [6, 13]
value in [13, 26]
value in [26, 34]


А вот в Python, к слову, есть такая "фича". Называется сhained comparison. Но подводный камень тот ещё.
Цитата:
For expressions without side effects, a < b < c is equivalent to a < b and b < c. However, there is a substantial difference when the expressions have side effects. a < f(x) < b will evaluate f(x) exactly once, whereas a < f(x) and f(x) < b will evaluate it twice if the value of a is less than f(x) and once otherwise.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Вторник, 05 Январь, 2010 23:42 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
kemiisto писал(а):
igor, вот держите вывод. Будьте любезны. :D
Код:
 
Вот те раз! Неужели компилятор, которым Вы пользуетесь, настолько кривой! Не могу в это поверить.

Насколько я смог понять из цитаты из Питона, сокращённый вариант даже предпочтительней, так как value гарантированно будет вычислено компилятором только единожды.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Вторник, 05 Январь, 2010 23:47 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
kemiisto, а у Вас есть возможность скомпилировать этот пример другими компиляторами с языка C++? Интересно было бы сравнить полученные результаты. Интерстроновский компилятор, например, по слухам очень качественный.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 00:01 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
igor писал(а):
kemiisto писал(а):
igor, вот держите вывод. Будьте любезны. :D
Код:
 
Вот те раз! Неужели компилятор, которым Вы пользуетесь, настолько кривой! Не могу в это поверить.

Язык кривой, не компилятор. Проверял на Apple g++ 4.2.1 и MS VC++ 2008.

igor писал(а):
Насколько я смог понять из цитаты из Питона, сокращённый вариант даже предпочтительней, так как value гарантированно будет вычислено компилятором только единожды.

Ну да. Зато велика вероятность, что захочеться "улучшить" код, переписав с таким вот "сокращённым вариантом". А разница-то есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 00:12 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
igor писал(а):
kemiisto, а у Вас есть возможность скомпилировать этот пример другими компиляторами с языка C++? Интересно было бы сравнить полученные результаты. Интерстроновский компилятор, например, по слухам очень качественный.

Да не важно. В С/С++ нет такой штуки, как двойные неравенства.

Код:
if (0 <= value <= 5)

Что тут происходит (?):
  • Вычисляется значение выражения 0 <= value. true.
  • Вычисляется значение выражения true <= 5. То есть 1 <= 5. true.

Код:
if (6 <= value <= 13)

Что тут происходит:
  • Вычисляется значение выражения 6 <= value. false.
  • Вычисляется значение выражения false <= 13. То есть 0 <= 13. true.

Всё приплыли. Ну и так далее. Вот она "строгая" типизация во всей своей красе. Максисмум можно warning'а добиться про unsafe usage of bool type.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 00:17 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
kemiisto писал(а):
А разница-то есть.
Но её НЕ ДОЛЖНО БЫТЬ!!! Я скорее поверю, что все компиляторы кривые.

Немного поясню. Как бы мы не записали такое условное выражение, в любом случае компилятор на уровне машинных команд будет проверять эти два условия последовательно. В этом смысле оба варианта записи эквивалентны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 00:22 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
kemiisto писал(а):
Код:
if (0 <= value <= 5)

Что тут происходит (?):
  • Вычисляется значение выражения 0 <= value. true.
  • Вычисляется значение выражения true <= 5. То есть 1 <= 5. true.
УЖОС!!! Вот это и называется кривой реализацией. Если компилятор работает именно так как Вы описали, то я просто в шоке от такого компилятора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 00:23 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
igor писал(а):
kemiisto писал(а):
А разница-то есть.
Но её НЕ ДОЛЖНО БЫТЬ!!!

Отчего же? Если в a < f(x) < b, f(x) - функция с побочным эффектом, то разница будет. Один вызов против двух. Как и процитировано чуть выше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 00:30 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
kemiisto писал(а):
Да не важно. В С/С++ нет такой штуки, как двойные неравенства.
Опаньки :D ! Если в языке двойных неравентсв нет, то компилятор не должен пропускать такие синтаксические конструкции. Иначе, про надёжность можно забыть. Хороший компилятор должен не только обеспечивать все специфицированные свойства и фенечки, но и пресекать всякую отсебятину.

Так что сюрпиз всё-таки есть. Но не со стороны языка, а со стороны компилятора. Настаиваю на этом.


Последний раз редактировалось igor Среда, 06 Январь, 2010 00:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 00:32 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 249
igor писал(а):
УЖОС!!! Вот это и называется кривой реализацией.

igor, это стандартное поведение. С++ International Standard ISO/IEC 14882:2003(E), 4.7 Integral conversions
Цитата:
4 If the destination type is bool, see 4.12. If the source type is bool, the value false is converted to zero and the value true is converted to one.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 00:38 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
kemiisto писал(а):
igor, это стандартное поведение. С++ International Standard ISO/IEC 14882:2003(E), 4.7 Integral conversions
Вот в этот момент у всех слушателей, мирно наблюдающих за нашей дружеской беседой, должно возникнуть смутное понимание того, почему я не программирую на C++ :wink: .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 00:55 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
kemiisto писал(а):
Если в a < f(x) < b, f(x) - функция с побочным эффектом, то разница будет. Один вызов против двух. Как и процитировано чуть выше.
Очень тонкий момент, на который я не обратил внимание :? .

Надо бы запретить использовать в выражениях функции с побочным эффектом. В языке, который я сейчас разрабатываю, так и будет :wink: . Я уже предварительно продумал соответствующие проектные решения. Подробности попридержу пока при себе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 09:00 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
igor писал(а):
Если компилятор работает именно так как Вы описали, то я просто в шоке от такого компилятора.


Это не компилятор. Это нормальное его поведение.
Семантика записанной конструкции именно такая - сравнение числа с булевым результатом от второго сравнения, приведённым к 0/1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 11:28 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Илья Ермаков писал(а):
Семантика записанной конструкции именно такая - сравнение числа с булевым результатом от второго сравнения, приведённым к 0/1.
Думаю, что проблема проистекает из того факта, что язык Си не видит отличий между целыми и логическими переменными. На самом нижнем уровне, конечно, всё можно представить целыми числами (даже вещественные числа :wink: - см. IEEE Standard 754). Но лично мне такая "мощь" в языке высокого уровня кажется по крайней мере странной.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 11:49 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
igor писал(а):
Так что сюрпиз всё-таки есть. Но не со стороны языка, а со стороны компилятора. Настаиваю на этом.
После предоставленных мне разъяснений не вижу смысла продолжать "настаивать на этом" :) . Сначала нужно убрать "муть" из языка и его стандарта. (Так! Это не призыв, а скорее риторическое пожелание).

Кстати, Дарья Донцова случайно не принимала участия в создании стандарта языка C++?
Чем можно объяснить и оправдать очевидное противоречие между "в языке Си нет двойных неравенств" и "это стандартное поведение компилятора"?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: C++, очередной сюрприз
СообщениеДобавлено: Среда, 06 Январь, 2010 12:20 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да не двойное это неравенство!

А сравнение константы с результатом выражения; в силу дефектов типизации С++ вторым выражением может быть и логическое (сравнение), оно автоматически приводится к числовому.

В С же (до ISO-99 точно) bool вообще не было, так что вообще никаких приведений - обычная арифметика получалась :)

Дефекты синтаксиса и семантики.

А компиляторы нормальные, в плане соответствия языку.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: Google [Bot] и гости: 3


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB