On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 20:02. Заголовок: Пример вычурной, но совершенно корректной конструкции С++.


Как известно С++ позволяет писать вычурные синтаксические конструкции, которые являются корректными с точки зрения стандарта С++, несмотря на то, что выглядеть могут они достаточно странно. Можно быо бы собрать коллекцию таких вычурных конструкций. Одну такую конструкцию, которую я придумал, я и хочу предложитть на ваше рассмотрение.

Сначала небольшой экскурс в теорию С++. Точка объявления имени в С++ сразу же следует после завершения ее декларатора. Что это оозначает? В следующем объявлении

int x = выражение;

Имя x становится видным в выражении в правой части объявления, так как декларатор для x совпадает с ее именем. Поэтому в следующем примере значение переменной x, объявленной во внутреннем блоке, будет неопределенным:

int x = 12; 
{
int x = x;
}


В предложении int x = x; в правой части используется имя переменной, декларатор которой уже объявлен в левой части объявления. А потому внешняя переменная x уже будет скрыта в правой части после знака присваивания.

Другой пример:

const int i = 2; 
{
int i[ i ];
}


В этом случае в качестве размера массива будет использоваться внешняя переменная i, так как декларатор представляет из себя i[ i ] То есть пока декларатор не завершен, объявляемое имя еще не видно. А это означает, что внешняя переменная с именем i будет видна, и поэтому будет обявлен массив с двумя элементами.

Эти примеры я взял из сттандарта С++.

Теперь можно продемонстрировать придуманный мною вычурный пример инициализации переменной при ее объявлении через саму себя.

#include <iostream> 

int main()
{
int x = ( std::cin >> x, x );

std::cout << "x = " << x << std::endl;
}


В этом примере объявление переменной x совершенно корректно, и переменная получит вполне определенное значение, которое вы введете через консоль.
Чтобы в этом убедиться, проанализируем эту конструкцию int x = ( std::cin >> x, x );.
Имя x сразу же становится видным в правой части объявления после знака присваивания. В этой правой части используется выражение с оператором запятая. Сначала выполняется ввод значения через стандартный поток std::cin . Оператор запятая гарантирует, что имеется точка последовательности вычисления после запятой. Поэтому в память переменной x будет записано то, что будет введено. Ну, а так как что-то должно быть присвоено переменной x, так как указан оператор присваивания, то в операторе запятая снова указывается сама переменная x.

Выглядет это вычурным, но тем не менее совершенно корректным.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]





ссылка на сообщение  Отправлено: 22.01.13 21:06. Заголовок: Вот простой пример и..


Вот простой пример использования такого вычурного определения переменной в программе вывода на консоль неотрицательного числа в обратном порядке следования его цифр (MS VC++ 2010):

 #include	"stdafx.h" 
#include <iostream>
#include <functional>

int _tmain(int argc, _TCHAR* argv[])

{
std::function<void( unsigned int )> reverse = [&]( unsigned int x )
{
std::cout << x % 10;
( x /= 10 ) ? reverse( x ) : void( std::cout << std::endl );
};


while ( unsigned int x = ( std::cout << "\nEnter a non-negative number (0 - exit): ",
std::cin >> x, x ) )
{
reverse( x );
}

return 0;
}


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 3
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет