Эллипсис примеры в русском языке. Почему эллипсис небезопасен: Игнорируется проверка типов данных

Термин "эллипсис", который используется как в литературоведении, так и музыке, произошел от греческого слова ellipsis, которое переводится как “выпадение” или “опущениие”.

Определение “эллипсис” в литературоведении

Если в речи наблюдается умышленное выпадение того или иного члена предложения (подлежащего, сказуемого и др.), то мы имеем дело с так называемым эллипсисом. Для чего это делается и не меняется ли смысл всего предложения из-за отсутствия одного из его членов? Эллипсис - это который встречается как в письменном, так и в устном Это делается с целью придания данному предложению выразительности, экспрессии, иногда интриги и т. д.

Эллипсис и В чем разница?

Однако не всегда опущение одного из членов в предложении является синтаксической фигурой (стилистическим приемом). Например, характерные повседневной устной речи, в которых наблюдается опущение одного из главных членов предложения, в большинстве случаев не являются эллипсисом. "Когда именно?" - спросите вы. Все дело в том, что в хоть и наблюдается отсутствие одного из его главных членов, однако это сделано неумышленно. А когда в тексте присутствует эллипсис (стилистическая фигура), то данное опущение преследует определенную цель или служит для усиления эффекта, но без искажения общей мысли. Кстати, в отличие от простых безличных предложений в случае эллипсиса опускаются не только главные, но и второстепенные члены предложения.

Эллипсис в литературе

Эта фигура речи в литературных произведениях, будь то проза или поэзия, используется авторами для того, чтобы заставить читателей самостоятельно домыслить умышленно пропущенную фразу или отдельное слово. Этот прием способствует вовлечению читателя, хотя и постфактум, в творческий процесс создания данного произведения.

Примеры эллипсиса

Приведем примеры данной стилистической фигуры:

Кстати, если эллипсис - это в русском языке опущение одного из составляющих предложение слов, то в английском и в некоторых других языках им называется многоточие.

Эллиптичность

Понятие, которое непосредственно связано с этим термином, называется “эллиптичностью”. Это очень интересный стилистический прием. В его основе лежит эллипсис. Это синтаксическая фигура (об этом уже говорилось выше), которая выражается в пропуске слов и словосочетаний в предложении, и даже предложений в тексте. В разговорной речи пропуски происходят из-за того, что собеседникам известны подробности той темы, вокруг которой ведется диалог, или же стали известны в ходе разговора, из предыдущих реплик. Иногда наряду с пропусками слов в речи, то есть “проглатыванием” слов, собеседники в беседе пользуются жестами, многозначительными взглядами, пожатием плеч и т. д. Этот прием также используется в театре. Здесь умышленно умалчиваются целые фразы, и зрителю необходимо подключить свою смекалку, чтобы понять то, что скрывается за молчанием актеров.

Виды эллипсиса

Пропуск слов, или так называемое “умолчание”, бывает разных видов.

  1. Косвенное . Этот вид эллипсиса встречается в тех произведениях, когда не называя тот или иной предмет, разговор ведется вокруг него, и все знают, о чем идет речь. Этот прием часто используется в драматических произведениях, например, в пьесах и т. д.
  2. Ситуативное . В этом случае эллипсис - это не просто выпадение того или иного слова или фразы, а его компенсация невербальными средствами общения - жестами или же междометиями, возгласами: ай-ай, ой-ой, ах-ах и т. д.
  3. Психологическое . Здесь умолчание может быть расценено как намек или недомолвка, секрет и т. д. В том случае, когда собеседников не двое, а несколько, то некоторые из них могут предположить, что от них желают что-то преднамеренно скрыть, и это может привести к нежелательным результатам. С другой стороны, психологический аспект этой фигуры речи в том, что двое или несколько очень близких друг другу человека могут говорить полуфразами, “глотать” предложения, при этом будут прекрасно понимать друг друга даже без слов. Этому способствует их духовная близость.

Другие разновидности эллипсиса

С точки зрения словообразования эллипсис бывает субстантивным, например, штрафной удар → штрафной (опускается основное слово, остается определение) и адъективным - пугало огородное → пугало (здесь, наоборот, опускается определение).

Типы эллипсиса

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

  • Стриппинг.
  • Гэппинг.
  • Псевдогэппинг.
  • Слусинг.
  • Эллипсис именной группы.
  • Эллипсис глагольной группы.
  • Сравнительный эллипсис.
  • Эллипсис при ответе на вопрос.
  • Нулевая анафора дополнения и др.

Эллипсис в музыке

Как уже было отмечено выше, этот термин употребляется как в лингвистике, так и в музыке. В обоих случаях эллипсис - это приблизительно одинаковое по смыслу понятие. И если в литературоведении оно означает опущение того или иного слова, словосочетания или же предложения с целью усиления эффекта от сказанного, то в музыке этим термином обозначают замену ожидаемого аккорда на какой-либо другой, который не есть функциональное следствие первого аккорда. Кроме этого определения можно дать и другое. Согласно нему эллиптический оборот, который бывает в музыке либо внутритональным, либо модульным, можно также охарактеризовать как пропуск одного из звеньев гармонии или ожидаемого аккорда.

Как уже было отмечено, эллипсисы в гармонии бывают внутритональными и модулирующими. Что это означает? Рассмотрим каждый отдельно.

  1. Внутритональный эллипсис образован из аккордов, которые своей последовательностью противоречат логике этого вида лада.
  2. Модулирующий же эллипсис иначе называется мелодико-гармонической модуляцией. Она происходит как следствие столкновения нескольких неустойчивых аккордов. Зачастую они являются диссонирующими и находятся в разных тональностях, но соединены плавно текущим голосоведением, которое, тем не менее, не имеет явных функциональных связей.

Условно выделяют четыре вида столкновения этих диссонирующих аккордов (те, кто знаком с музыкальной грамотой, поймут, о чем идет речь):

  • S-S (они встречаются у например, в произведении “Радость и горе”).
  • D-D (этим приемом любил пользоваться “великий глухой” - Л. В. Бетховен, например, в своем произведении "Соната № 2").
  • D-S (Э. Григ - произведение “Свежа ты как весна”).

Кстати, эллиптическая модуляция, как правило, бывает внезапной, поскольку в ней вступают во взаимодействие неродственные тональности. Кроме эклиптической, в музыке существуют и другие виды модуляции, и они характерны для развивающихся частей музыкальных форм.

Эллипсис (гр. elleipsis - опущение, недостаток) - речевое явление, заключающееся в коммуникативно значимом опущении структурных элементов предложения.

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

Эти предложения не нуждаются ни в контексте, ни в ситуации, для того чтобы составить представление о действии или состоянии. Оно выражается всей конструкцией в целом, цель которой сообщить о месте, времени, способе, характеризующих действие или состояние, или указать на объект действия, направление действия: На синем, ослепительно синем небе - полыхающее огнем июльское

Эллиптические предложения обычно соотносятся с полными, в которых сказуемые выражены глаголами бытия, наличия, обнаружения, восприятия: Вокруг месяца бледные круги (А. Н. Т.); Над площадью низко нависшая пыль(Шол. ), глаголами со значением речи: Марья - ему вслед, негромко: - Хлеб весь, чай, съел? (А. Н. Т.), а также некоторыми глаголами движения: Он к воротам, но из окна послышался голос матери (Гонч.); Я за ним следом (М. Г.) и глаголами со значением энергичного действия (схватить, толкнуть, ударить, бросить и т. д.): - В огонь их!.. - пронеслось в толпе (М.-Сиб.).

Лексическая ограниченность отсутствующих глаголов-сказуемых проявляется в однотипности построения эллиптических предложений: члены, их составляющие, немногочисленны. Второстепенные члены в них либо обстоятельства места и реже времени или причины (Всюду степь: Я - в магазин. В пять часов проверка; Оттого-то и тоска), либо дополнения со значением замещаемого предмета(Вместо ответа молчание), предмета назначения (Для вас дорогие подарки), отнесенности к лицу (У отца собрание) - и некоторые другие.

Эллиптические предложения относят иногда к неполным или к особому виду неполных 1 . Однако некоторые лингвисты считают такие предложения неполными лишь в историческом плане и не относят их к неполным в современном русском языке 2 . Такие предложения действительно не могут квалифицироваться как неполные, так как их неполнота является структурной нормой, и сопоставление их с полными конструкциями - это всего лишь условный прием для выявления их конструктивной специфики.

Это вполне типизированные построения, не нуждающиеся в восстановлении членов предложения, они являются достаточно полными (даже вне контекста) с точки зрения их коммуникативного задания, что же касается их грамматического построения, то специфика его заключается в наличии подчиненных словоформ, обнаруживающих глагольную зависимость. Однако эта «зависимость» весьма относительна: эти словоформы характеризуются все более свободным функционированием. Такая зависимость еще явно ощущается в конструкциях типа Налево - дверь в переднюю; За углом - книжная лавка и утрачивается в предложениях типа Дорога в лесу; Встреча у обелиска, где субстантивное влияние настолько велико, что побеждает бывшее глагольное и функционально преобразует зависимые словоформы, причем эллипсис в этих случаях уже не ощущается: такие предложения воспринимаются как номинативные с определительным членом, и их бывшая эллиптичность - это одна из ступеней развития данного типа предложения. Не случайно некоторые лингвисты считают возможным отнесение к номинативным предложениям даже конструкций с препозитивным обстоятельством на том основании, что такое обстоятельство (детерминант) не предполагает обязательной зависимости от глагола (В поле ветер; В воздухе тишина) и относится ко всему предложению в целом. Несомненно, что подстановка глагола-сказуемого здесь выглядит по меньшей мере искусственно, поскольку в современном русском языке такие предложения, конечно, создаются без участия глагола, тем более трудно обнаружить конструктивную роль глагола в предложениях типа За окном тихий свист сторожа (М. Г.) и Сегодня воскресенье . В. В. Виноградов называет подобные обстоятельственные конструкции «свободными», так как здесь нет прямой зависимости от какой-либо определенной части речи. Более того: «Соответствующие формы косвенных падежей с предлогом зависят не столько от глаголов, которые ими не управляют, сколько от самих предлогов конкретно-пространственного значения: над, за, от. п.». «Вместе с тем,- продолжает В. В. Виноградов, - несомненно, что в процессе исторического развития языка круг синтаксических явлений, связанных с так называемым слабым управлением, с более или менее самостоятельным употреблением предложных

Разные типы неполных и эллиптических предложений как факт живой разговорной речи в последние годы широко применяются в языке газеты. Эти конструкции дают богатый материал для выработки структуры заголовков, многочисленные эллипсисы здесь - это уже своего рода стандарт. Язык газеты стремится к динамичности, броскости. Этому способствуют, в частности, предельно краткие предложения с пропуском избыточных в информационном отношении слов. Вот примеры заголовков из газет: Вузы - народному хозяйству; Горному земледелию - научные основы; Перевозкам зерна - скорость и ритм; Ученые - родине; Радио - школьникам; Мир - Земле. Такие эллипсисы чрезвычайно экономны с точки зрения средств выражения. В заголовке называются только те члены предложения, которые являются целевыми в данном высказывании, все остальное логически восполняется текстом, речевой ситуацией, избавляющими от необходимости в назывании всех звеньев грамматической структуры. В неполных предложениях-заголовках отсутствие одного или нескольких членов структуры в большинстве случаев является синтаксической нормой, создающей стилистическую и экспрессивную окраску предложений-заголовков. Газетные заголовки, изобилующие такими построениями, выражают мысль в максимально сжатой форме. Интересно, что среди предложений-заголовков формируются специфические структуры, приемлемые только в сфере названий и невозможные в самом тексте статьи, заметки и т. д., например: Коротко о важном; На промысел - самолетом; Хлеб - Родине. Развитие подобных структур вызвано потребностью узаконить применительно к специфике заголовка особые модели предложений, которые, несмотря на сокращение языкового материала, дают максимальный эффект в привлечении внимания читателя. Предложения-заголовки часто строятся на базе сочетания только форм косвенных падежей. Такая тенденция к экономии средств выражения в заголовках способствует аккумуляции мысли. Однако при чрезмерном увлечении подобными конструкциями возникает опасность негативного стилистического эффекта.

Разновидности:

1. Требование/просьба предоставить объект («Плаху!»)

2. Распределение объекта («Им он по порции»)

3. Активное физическое воздействие на объект («Я тебя костылем»)

4. Физический контакт, часто интенсивного характера («А он за рукав»)

5. Движение субъекта в пространстве («Федька за порог»)

6. Перемещение объекта в пространстве

7. Целенаправленное движение

8. Местоположение субъекта

9. Временная приуроченность события

10. Изменение состояния субъекта (переход в физическое или психологическое состояние, перевод на другую должность, изменение вида)

11. Изменение состояния объекта; результат воздействия

12. Начало действия («Дружно за работу»)

13. Отношение субъекта к другому лицу/предмету

14. Речь или мысль

ЭЛЛИПТИЧЕСКИЕ предложения НЕ могут рассматриваться как неполные. Они не имеют соотносительных полных вариантов. Конкретное сказуемое в них не может быть восстановлено, поскольку каждое эллиптическое предложение нужно сопоставлять с несколькими глагольными предложениями, включающими всю семантическую группу. В эллиптических предложениях глагол сокращён без «возмещения» в контексте. Семантика соответствующей группы глаголов выражается с помощью зависимого члена словосочетания, который способствует указанию на процесс движения, речи. Эллиптическую модель образует непосредственное соединение субстантивного члена, обозначающего деятеля, и глагольного словосочетания со значением цели движения, объекта речи и т. д. Распространены в речи продуктивные модели этих предложений: семантика движения, перемещения, интенсивного физического действия; сокращены малочисленные семантические группы или единичные конкретные глаголы.

От эллиптических предложений следует отличать ФРАЗЕОЛОГИЗИРОВАННЫЕ безглагольные предложения. Они служат для выражения приветствия, пожелания, привлечения или поддержания внимания и т. д. Они не строятся, а воспроизводятся как готовые единицы (напр. «Спокойной ночи!», «Что нового?», «С праздником!», «Я к Вам.»…).

В условиях общения, в контексте конкретные предложения могут квалифицироваться по-разному. Например: «Товарищ решил обратиться к своему тренеру: А я – к вам» - неполное; «И тут позвонили – приходите: Я – к вам» - эллиптическое; «Доброе утро! Я к вам!» - фразеологизированное.

разговорного стиля .

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

Выделяют два вида эллипсиса:

  1. Субстантивный (субстантивизиирующий): штрафной удар > штрафной
  2. Адъективный (деадъективизирующий): огородное пугало > пугало

Примеры

«Как на вкус было новое блюдо?» - «Ничего». (подразумевается: ничего плохого, не к чему придраться.)

Эллипсис и конверсия

Закрепившийся за выражением эллипсис слова вызывает смену частеречного статуса другого слова, подчинённого первому. Например в выражении шампанское вино слово вино обычно лишнее, потому что с другими существительными шампанское не употребляется (разве что в женском роде), и шампанское берёт на себя роль существительного.

Синтаксическая роль может и прирасти к слову - в исходном частеречном статусе слово перестаёт употребляться. Например, при пропуске второго слова в ст.-слав. дроугъ чьловѣкъ («другой человек») первое слово прилагательным быть перестало, став существительным друг .

Типы эллипсиса

Существует множество признаваемых лингвистами типов эллипсиса. Некоторые из них:

  • Гэппинг (en:Gapping)
  • Псевдогэппинг (en:Pseudogapping)
  • Стриппинг (en:Stripping (linguistics))
  • Слусинг (en:Sluicing)
  • Эллипсис глагольной группы (en:Verb phrase ellipsis)
  • Эллипсис именной группы (en:Noun ellipsis)
  • Фрагментирование, или эллипсис при ответе на вопрос (en:Answer ellipsis)
  • Сравнительный эллипсис (англ. сomparative deletion )
  • Нулевая анафора дополнения (англ. null complement anaphora )

См. также

Напишите отзыв о статье "Эллипсис"

Примечания

Литература

  • Я.Г. Тестелец . // Конференция «Типология морфосинтаксических параметров»: доклад. - М .: МГГУ, 2011.

Отрывок, характеризующий Эллипсис

– Чего бояться?
– Я боюсь, что ты погубишь себя, – решительно сказала Соня, сама испугавшись того что она сказала.
Лицо Наташи опять выразило злобу.
– И погублю, погублю, как можно скорее погублю себя. Не ваше дело. Не вам, а мне дурно будет. Оставь, оставь меня. Я ненавижу тебя.
– Наташа! – испуганно взывала Соня.
– Ненавижу, ненавижу! И ты мой враг навсегда!
Наташа выбежала из комнаты.
Наташа не говорила больше с Соней и избегала ее. С тем же выражением взволнованного удивления и преступности она ходила по комнатам, принимаясь то за то, то за другое занятие и тотчас же бросая их.
Как это ни тяжело было для Сони, но она, не спуская глаз, следила за своей подругой.
Накануне того дня, в который должен был вернуться граф, Соня заметила, что Наташа сидела всё утро у окна гостиной, как будто ожидая чего то и что она сделала какой то знак проехавшему военному, которого Соня приняла за Анатоля.
Соня стала еще внимательнее наблюдать свою подругу и заметила, что Наташа была всё время обеда и вечер в странном и неестественном состоянии (отвечала невпопад на делаемые ей вопросы, начинала и не доканчивала фразы, всему смеялась).
После чая Соня увидала робеющую горничную девушку, выжидавшую ее у двери Наташи. Она пропустила ее и, подслушав у двери, узнала, что опять было передано письмо. И вдруг Соне стало ясно, что у Наташи был какой нибудь страшный план на нынешний вечер. Соня постучалась к ней. Наташа не пустила ее.
«Она убежит с ним! думала Соня. Она на всё способна. Нынче в лице ее было что то особенно жалкое и решительное. Она заплакала, прощаясь с дяденькой, вспоминала Соня. Да это верно, она бежит с ним, – но что мне делать?» думала Соня, припоминая теперь те признаки, которые ясно доказывали, почему у Наташи было какое то страшное намерение. «Графа нет. Что мне делать, написать к Курагину, требуя от него объяснения? Но кто велит ему ответить? Писать Пьеру, как просил князь Андрей в случае несчастия?… Но может быть, в самом деле она уже отказала Болконскому (она вчера отослала письмо княжне Марье). Дяденьки нет!» Сказать Марье Дмитриевне, которая так верила в Наташу, Соне казалось ужасно. «Но так или иначе, думала Соня, стоя в темном коридоре: теперь или никогда пришло время доказать, что я помню благодеяния их семейства и люблю Nicolas. Нет, я хоть три ночи не буду спать, а не выйду из этого коридора и силой не пущу ее, и не дам позору обрушиться на их семейство», думала она.

ЭЛЛИПС (в литературе) ЭЛЛИПС (в литературе)

Э́ЛЛИПС (от греч. elleipsis - выпадение, опущение), фигура стилистическая, пропуск структурно-необходимого элемента высказывания, обычно легко восстанавливаемого в данном контексте или ситуации («Не тут-то [было]. Море не горит». - Крылов).


Энциклопедический словарь . 2009 .

Смотреть что такое "ЭЛЛИПС (в литературе)" в других словарях:

    - (от греч. elleipsis – выпадение, опущение), стилистическая фигура; пропуск слова или ряда слов в предложении, при котором смысл пропущенных членов легко восстановить из общего речевого контекста. Эллипс часто используется в эпических и… … Литературная энциклопедия

    Линии пересечения круглого конуса (см. Коническая поверхность) с плоскостями, не проходящими через его вершину. В зависимости от взаимного расположения конуса и секущей плоскости получают три типа конического сечения: эллипс (рис., а), параболу… … Энциклопедический словарь

    РОДЫ - РОДЫ. Содержание: I. Определение понятия. Изменения в организме во время Р. Причины наступления Р..................... 109 II. Клиническое течение физиологических Р. . 132 Ш. Механика Р. ................. 152 IV. Ведение Р.................. 169 V … Большая медицинская энциклопедия

    Классическая электродинамика … Википедия

    Венгерская Республика, гос во в Центр. Европе. Название от этнонима венгры. Сами же венгры называют себя мадьяры, а свою страну Мадьярорсаг (Magyarorszag) страна мадьяров. См. также Трансильвания. Географические названия мира: Топонимический… … Географическая энциклопедия

    Множество Мандельброта классический образец фрактала … Википедия

    Полярная сетка, на которой отложено несколько углов с пометками в градусах. Полярная система координат двумерная система координат, в которой каждая точка на плоскости определяется двумя числами полярным углом и полярны … Википедия

    Множество Мандельброта классический образец фрактала Фрактал (лат. fractus дробленый) термин, означающий геометрическую фигуру, обладающую свойством самоподобия, то есть составленную из нескольких частей, каждая из которых подобна всей фигуре… … Википедия

    Раздел астрономии, изучающий движения тел Солнечной системы в гравитационном поле. При решении некоторых задач Н. м. (например, в теории движения комет) учитываются также и негравитационные эффекты: реактивные силы, сопротивление среды,… … Большая советская энциклопедия

Во всех функциях, которые мы рассматривали до сих пор, количество параметров этих функций должно было быть известно заранее (даже если это ). Однако есть несколько случаев, в которых полезно передать переменную, указывающую на количество параметров, в функцию. В C++ есть специальный объект, который позволяет это делать — эллипсис.

Поскольку эллипсис редко используется и считается потенциально опасным, то мы рекомендуем избегать его использования вообще. Этот урок не является обязательным в продвижении изучения С++ и на ваш прогресс не повлияет, если это вам интересно – продолжайте читать, если нет, то нет.

Функции, использующие эллипсис, выглядят следующим образом:

тип_возврата имя_функции(список_аргументов, ...)

список_аргументов — это один или несколько обычных параметров функции. Обратите внимание, функции, которые используют эллипсис, должны иметь по крайней мере один параметр не-эллипсис.

Эллипсис (который представлен в виде многоточия … ) всегда должен быть последним параметром в функции. О нём можно думать, как о , который содержит любые другие параметры, кроме тех, что указаны в списке_аргументов.

Пример эллипсиса

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

#include #include // Переменная count - это количество передаваемых аргументов double findAverage(int count, ...) { double sum = 0; va_list list; va_start(list, count); // Перебираем каждый из аргументов эллипсиса for (int arg=0; arg < count; ++arg) sum += va_arg(list, int); va_end(list); return sum / count; } int main() { std::cout << findAverage(4, 1, 2, 3, 4) << "\n"; std::cout << findAverage(5, 1, 2, 3, 4, 5) << "\n"; }

#include

#include // требуется для использования эллипсиса

// Эллипсис должен быть последним параметром

// Переменная count - это количество передаваемых аргументов

double findAverage (int count , . . . )

double sum = 0 ;

// Мы получаем доступ к эллипсису через va_list, поэтому объявляем его

va_list list ;

// Инициализируем va_list используя va_start. Первый параметр - это список, который нужно инициализировать

// Второй параметр - это последний параметр не-эллипсис

va_start (list , count ) ;

// Перебираем каждый из аргументов эллипсиса

for (int arg = 0 ; arg < count ; ++ arg )

// Используем va_arg для получения параметров из эллипсиса

// Первый параметр - это va_list, который мы используем

// Второй параметр - это ожидаемый тип параметров

sum += va_arg (list , int ) ;

// Выполняем очистку va_list, когда уже сделали всё необходимое

va_end (list ) ;

return sum / count ;

int main ()

std :: cout << findAverage (4 , 1 , 2 , 3 , 4 ) << "\n" ;

std :: cout << findAverage (5 , 1 , 2 , 3 , 4 , 5 ) << "\n" ;

Результат выполнения программы выше:

Как вы можете видеть, функция findAverage принимает переменную count, которая указывает на количество передаваемых аргументов. Рассмотрим другие компоненты этого примера.

Во-первых, мы должны подключить cstdarg. Этот заголовок определяет va_list , va_start и va_end — макросы, которые нам нужно использовать для доступа к параметрам, которые являются частью эллипсиса.

Затем мы объявляем функцию, которая использует эллипсис. Помните, что список_аргументов должен быть представлен одним или несколькими фиксированными параметрами. Здесь мы передаем одно целочисленное значение, которое сообщает функции, сколько будет параметров.

Обратите внимание, в эллипсисе нет никаких имён переменных! Вместо этого мы получаем доступ к значениям через специальный тип — va_list. О va_list можно думать, как об , который указывает на массив с эллипсисом. Сначала мы объявляем переменную va_list, которую называем просто «list» для удобства использования.

Затем нам нужно чтобы list указывал на параметры эллипсиса. Делается это с помощью va_start(). va_start() имеет два параметра: va_list и имя последнего параметра не-эллипсиса функции. После того, как va_start() был вызван, va_list указывает на первый параметр в многоточии.

Чтобы получить значение параметра, на который указывает va_list – нужно использовать va_arg(). va_arg() также принимает два параметра: va_list и тип данных параметра, к которому мы пытаемся получить доступ. Обратите внимание, с помощью va_arg() мы также переходим к следующему параметру va_list!

Наконец, когда мы уже всё сделали, нужно выполнить очистку — va_end() с параметром va_list.

Почему эллипсис небезопасен: Игнорируется проверка типов данных

Эллипсис предлагает программисту большую гибкость для реализации функций, которые принимают переменную, указывающую на общее количество параметров. Однако эта гибкость имеет свои недостатки.

С обычными параметрами функции компилятор использует проверку типов для гарантии того, что типы аргументов функции соответствуют типам параметров функции (или аргументы могут быть для дальнейшего соответствия). Это делается с целью предотвращения случаев, когда вы передаете функции целочисленное значение, тогда как она ожидает , или наоборот. Обратите внимание, параметры эллипсиса не имеют объявлений типа данных. При их использовании компилятор полностью пропускает проверку типов данных. Это означает, что можно отправить аргументы любого типа в многоточии и компилятор не сможет предупредить вас, что это произошло. В конечном счете получится сбой или функция произведет неверные результаты. При использовании эллипсиса вся ответственность ложится на caller-а и от него зависит корректность переданных аргументов в функцию. Очевидно, что это является хорошей лазейкой для возникновения ошибок.

Рассмотрим пример такой ошибки:

Std::cout << findAverage(6, 1.0, 2, 3, 4, 5, 6) << "\n";

std :: cout << findAverage (6 , 1.0 , 2 , 3 , 4 , 5 , 6 ) << "\n" ;

Хотя на первый взгляд всё может показаться достаточно безвредным, но посмотрите на второй аргумент (первый аргумент эллипсиса) типа double – он должен быть типа int. Хотя всё скомпилируется без ошибок, но результат будет следующий:

Число немаленькое. Как это произошло?

Как мы уже знаем из предыдущих уроков, компьютер сохраняет все данные в виде последовательности битов. Тип переменной указывает компьютеру, как перевести эту последовательность битов в определенное (читабельное) значение. Однако в эллипсисе тип переменной отбрасывается. Следовательно, единственный способ получить нормальное значение обратно из эллипсиса — вручную указать va_arg(), каков ожидаемый тип параметра. Это то, что делает второй параметр в va_arg(). Если фактический тип параметра не соответствует ожидаемому типу параметра, то происходят плохие вещи.

В программе выше, с помощью va_arg(), мы указали, что все параметры должны быть типа int. Следовательно, каждый вызов va_arg() будет возвращать последовательность битов, которая будет конвертирована в тип int.

В этом случае проблема заключается в том, что double, который мы передали в качестве первого аргумента эллипсиса, занимает 8 байтов, тогда как va_arg(list, int) возвращает только 4 байта данных при каждом вызове (тип int занимает 4 байта). Следовательно, первый вызов va_arg возвращает первую часть типа double (4 байта), а второй вызов va_arg возвращает вторую часть типа double (еще 4 байта). Итого, общий результат — мусор.

Поскольку проверка типов пропущена, то компилятор даже не будет жаловаться, если мы сделаем что-то вообще дикое, например:

Int value = 8; std::cout << findAverage(7, 1.0, 3, "Hello, world!", "G", &value, &findAverage) << "\n";

int value = 8 ;

std :: cout << findAverage (7 , 1.0 , 3 , "Hello, world!" , "G" , &value , &findAverage ) << "\n" ;

Верьте или нет, но это действительно скомпилировалось без ошибок и выдало следующий результат на компьютере автора:

Этот результат подтверждает фразу: «Мусор на входе, мусор на выходе».

Почему эллипсис небезопасен: Эллипсис не знает количество переданных параметров

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

Способ №1: Передать параметр-длину

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

Однако даже здесь мы столкнемся с проблемами. Например:

Std::cout << findAverage(6, 1, 2, 3, 4, 5) << "\n";

std :: cout << findAverage (6 , 1 , 2 , 3 , 4 , 5 ) << "\n" ;

Что случилось? Мы сообщили findAverage(), что собираемся передать 6 значений, но фактически передали только 5. Следовательно, с первыми пятью значениями, возвращаемыми va_arg(), всё нормально. Но 6-е значение, которое возвращает va_arg() – это просто мусор из , так как мы его не передавали. Следовательно, такой вот и результат. По крайней мере, здесь очевидно, что это значение является мусором.

А вот рассмотрим более коварный случай:

Std::cout << findAverage(6, 1, 2, 3, 4, 5, 6, 7) << "\n";

std :: cout << findAverage (6 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ) << "\n" ;

Результат:

На первый взгляд результат выглядит корректно, но последнее число 7 в списке аргументов игнорируется, так как мы сообщили, что собираемся предоставить 6 параметров (а предоставили 7). Такие ошибки бывает довольно-таки трудно вычислить.

Способ №2: Использовать контрольное значение

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

#include #include // требуется для использования эллипсиса // Эллипсис должен быть последним параметром double findAverage(int first, ...) { // Обработка первого значения double sum = first; // Мы получаем доступ к эллипсису через va_list, поэтому объявляем его va_list list; // Инициализируем va_list используя va_start. Первый параметр - это список, который нужно инициализировать // Второй параметр - это последний параметр не-эллипсис va_start(list, first); int count = 1; // Бесконечный цикл while (1) { // Используем va_arg для получения параметров из эллипсиса // Первый параметр - это va_list, который мы используем // Второй параметр - это ожидаемый тип параметров int arg = va_arg(list, int); // Если текущий параметр является контрольным значением, то прекращаем выполнение цикла if (arg == -1) break; sum += arg; count++; } // Выполняем очистку va_list, когда уже сделали всё необходимое va_end(list); return sum / count; } int main() { std::cout << findAverage(1, 2, 3, 4, -1) << "\n"; std::cout << findAverage(1, 2, 3, 4, 5, -1) << "\n"; }

#include

#include // требуется для использования эллипсиса

// Эллипсис должен быть последним параметром

double findAverage (int first , . . . )

// Обработка первого значения

double sum = first ;

// Мы получаем доступ к эллипсису через va_list, поэтому объявляем его

va_list list ;

// Инициализируем va_list используя va_start. Первый параметр - это список, который нужно инициализировать

// Второй параметр - это последний параметр не-эллипсис

va_start (list , first ) ;

int count = 1 ;

// Бесконечный цикл

while (1 )

// Используем va_arg для получения параметров из эллипсиса

// Первый параметр - это va_list, который мы используем

// Второй параметр - это ожидаемый тип параметров

int arg = va_arg (list , int ) ;

// Если текущий параметр является контрольным значением, то прекращаем выполнение цикла

if (arg == - 1 )

break ;

sum += arg ;

count ++ ;

// Выполняем очистку va_list, когда уже сделали всё необходимое

va_end (list ) ;

return sum / count ;

int main ()

std :: cout << findAverage (1 , 2 , 3 , 4 , - 1 ) << "\n" ;

std :: cout << findAverage (1 , 2 , 3 , 4 , 5 , - 1 ) << "\n" ;

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

Однако здесь есть также несколько проблем. Во-первых, C++ требует, чтобы мы передавали хотя бы один фиксированный параметр. В предыдущем примере это была наша переменная count. В этом примере первое значение является частью чисел, используемых в вычислении. Поэтому вместо обработки первого значения в паре с другими параметрами эллипсиса, мы явно объявляем его как обычный параметр. Затем нам нужно это обработать внутри функции (мы присваиваем переменной sum значение first, а не 0, как в предыдущей программе).

Во-вторых, требуется, чтобы пользователь передал контрольное значение последним в списке. Если пользователь забудет передать контрольное значение (или передаст неправильное), то функция будет циклически работать до тех пор, пока не дойдёт до значения, которое будет соответствовать контрольному (которое не было указано), т.е. мусору (или произойдет сбой).

Способ №3: Использовать строку-декодер

Передайте строку-декодер в функцию, чтобы сообщить, как правильно интерпретировать параметры.

#include #include #include // требуется для использования эллипсиса // Эллипсис должен быть последним параметром double findAverage(std::string decoder, ...) { double sum = 0; // Мы получаем доступ к эллипсису через va_list, поэтому объявляем его va_list list; // Инициализируем va_list используя va_start. Первый параметр - это список, который необходимо инициализировать // Второй параметр - это последний параметр не-эллипсис va_start(list, decoder); int count = 0; // Бесконечный цикл while (1) { char codetype = decoder; switch (codetype) { default: case "\0": // Выполняем очистку va_list, когда уже сделали всё необходимое va_end(list); return sum / count; case "i": sum += va_arg(list, int); count++; break; case "d": sum += va_arg(list, double); count++; break; } } } int main() { std::cout << findAverage("iiii", 1, 2, 3, 4) << "\n"; std::cout << findAverage("iiiii", 1, 2, 3, 4, 5) << "\n"; std::cout << findAverage("ididdi", 1, 2.2, 3, 3.5, 4.5, 5) << "\n"; }

#include

#include

#include // требуется для использования эллипсиса

// Эллипсис должен быть последним параметром

double findAverage (std :: string decoder , . . . )

double sum = 0 ;

// Мы получаем доступ к эллипсису через va_list, поэтому объявляем его

va_list list ;

// Инициализируем va_list используя va_start. Первый параметр - это список, который необходимо инициализировать

// Второй параметр - это последний параметр не-эллипсис

va_start (list , decoder ) ;



Последние материалы раздела:

SA. Парообразование. Испарение, конденсация, кипение. Насыщенные и ненасыщенные пары Испарение и конденсация в природе сообщение
SA. Парообразование. Испарение, конденсация, кипение. Насыщенные и ненасыщенные пары Испарение и конденсация в природе сообщение

Все газы явл. парами какого-либо вещества, поэтому принципиальной разницы между понятиями газ и пар нет. Водяной пар явл. реальным газом и широко...

Программа и учебные пособия для воскресных школ А тех, кто вокруг, не судить за грехи
Программа и учебные пособия для воскресных школ А тех, кто вокруг, не судить за грехи

Учебно-методический комплект "Вертоград" включает Конспекты учителя, Рабочие Тетради и Сборники тестов по следующим предметам:1. ХРАМОВЕДЕНИЕ...

Перемещение Определить величину перемещения тела
Перемещение Определить величину перемещения тела

Когда мы говорим о перемещении, важно помнить, что перемещение зависит от системы отсчета, в которой рассматривается движение. Обратите внимание...