• Авторизация


Бесполезные результаты грамматики С++ 25-03-2009 23:56 к комментариям - к полной версии - понравилось!


Я утверждаю, что система типов
и семантика С++ чище, чем
его синтаксис
Бьерн Страуструп


   Изучая грамматику С++ обнаружил, что с ее помощью можно
строить очень странные выражения, которые можно писать только в последний
день перед увольнением:). Некоторые из этих выражений приведены в программе:


#include <iostream>

int main(int argc, char* argv[])
{
int a = +-+-+-+-+10;
int b = 5*-+-+a;

std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;


{
{
{
{
10;
std::cout << "Hello;)\n";
}
}
}
}

((a > 10)?a:b) = 100;

std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;

std::cout << ((2 < 5)?a=1, b=2, a+b: 0) << std::endl;
(1 > 0)?0:throw 1;

try
{
(1 < 0)?0:throw 1;
}
catch( ... )
{
std::cout << "Exception;)\n";
}

std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
std::cout << !!!!!!!!!!!!1 << std::endl;
}

----------------------------------------------
Результата работы программы
----------------------------------------------
a = 10
b = 50
Hello;)
a = 10
b = 100
3
Exception;)
a = 1
b = 2
1
------------------------------------------------

   Выражения с несколькими унарными знаками возможны согласно правилам:




выражение-приведения =>
унарное-выражение

унарное-выражение =>
унарный-оператор выражение-приведения

унарный-оператор =>
* & + - ! ~


   Несколько вложенных "составных инструкций" возможны по
правилам:




инструкция =>
составная-инструкция

составная-инструкция =>
{ последовательность-инструкций }

последовательность-инструкций =>
инструкция


   Приводить правила грамматики позволяющие строить с "условным выражением" такие конструкции я не буду, так как их много, если кому интересно смотрите, например в [1]. А следующее выражение допустимо, потому что оно выводима с помощью правил грамматики С++ и результат применения оператора к операнду lvalue является lvalue, если это приемлемо с точки зрения логики (lvalue - это выражение, ссылающееся на какую-то непрерывную область в памяти):


   ((a > 10)?a:b) = 100;

Например, на следующее выражение компилятор будет шибко ругаться, хотя оно и верно синтаксически, так как результат "логического ИЛИ" не есть lvalue:

   (a || b) = 1;



      Литература

1. Б. Страуструп. Язык программирования С++. Специальное издание.
2. Б. Страуструп. Дизайн и эволюция С++.

вверх^ к полной версии понравилось! в evernote
Комментарии (5):
brutalnoe 28-03-2009-00:27 удалить
у меня аж палец устал крутить столь содержательный код)) похожий на рисунок из фигурных скобок
tomato_horror 05-04-2009-01:47 удалить
Литература "Стив Макконнелл. Совершенный код" интересней почитать!!!
DoubleF 07-05-2009-12:49 удалить
Кстати, фишка с оператором ?: иногда очень даже полезна:)
DoubleF 07-05-2009-12:58 удалить
class A
{
public:
A& operator||(const A&)
{
}
A& operator=(int)
{
}
};

int main(int argc, char* argv[])
{
A a,b;
(a || b) = 1;
return 0;
}


Комментарии (5): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Бесполезные результаты грамматики С++ | whitewin - Дневник whitewin | Лента друзей whitewin / Полная версия Добавить в друзья Страницы: раньше»