В сегодняшней статье мы рассмотрим правописание одного из наиболее часто используемых слов русского языка. Это слово «пожалуйста». Как оно правильно пишется? Посмотрим также на распространённые ошибки, встречающиеся на письме. Давайте начнём.
Происхождение слова
Чтобы выяснить, как правильно пишется слово, необходимо проанализировать его происхождение. Это слово появляется в речи несколько столетий назад, когда выражение вежливой просьбы сопровождалось обращением к собеседнику словами старый или старший. Данные слова в устной речи сокращались до формы «-ста». И слово «пожалуйста» выражалось в виде двух слов: пожалуй и старший. В дальнейшем частица «-ста» сократилась ещё больше, превратившись в прибавку «-с», часто встречающуюся в дореволюционной России и русской классической литературе. Например:
—Имейте-с правила в жизни!.. Твёрдые правила, согласные с совестью… Без них можно, пожалуй, иметь успех-с… выиграть по службе, что ли, но нельзя жить в душевном мире с самим собой!.. Это верно! И выдерживать штормы в жизни только тогда легко, когда совесть не за бортом-с!
(К.М.Станюкович «Василий Иванович»)
Таким образом, из этимологии слова видим, что правильное окончание для этого слова — всегда «а», не «о».
Правописание слова
Изучим другие стороны правописания данного слова. Рассмотрим также и неправильные варианты написания с точки зрения грамматики русского языка.
Правильно
Это слово пишется правильно только в форме «пожалуйста». Рекомендуем запомнить данное слово или смотреть его верное написание в орфографическом словаре. Да, это слово сложное не только потому, что не существует в современном русском языке проверочных слов для гласных букв в его середине, но и потому, что буква «й» в середине слова пишется, но не произносится.
Неправильно
Многие люди, к сожалению, пишут это слово неправильно в самых разных формах: пажалуйста, пожалуйсто, пожалуста и т. п. Кто во что горазд! Встречаются оригиналы, сокращающие это слово и пишущие его в формах пжлст и пжалста. Последние две формы чаще всего можно встретить в общении на различных форумах в сети Интернет. Есть и такие, кто использует англицизм в русском варианте в виде «плиз» (от английского слова пожалуйста — «please»).
Мы не рекомендуем пользоваться подобными вариантами слова «пожалуйста». Все они неправильны и являются выставлением пишущего в неприглядном свете как человека малообразованного.
Примеры
- Переподпишите, пожалуйста, контракт на новый срок действия.
- Закрывайте, пожалуйста, дверь во избежание сквозняка!
- «Тише, пожалуйста!» (Название рассказа Артура Кларка)
Семантические свойства
Семантический разбор слова показывает, что по своему значению слово пожалуйста может быть частицей или вводным словом. При этом часть речи слова «пожалуйста» — это этикетное междометие, такая форма культуры речи, к которой относятся и подобные слова: здравствуйте, спасибо, простите и т. д.
Рассмотрим подробнее семантические свойства слова «пожалуйста».
Вводное слово
«Пожалуйста» в виде вводного слова необходимо использовать во время какой-либо вежливой просьбы к собеседнику. Например, фраза «скажите, пожалуйста, который час» звучит более культурно, чем фраза «скажите, который час».
«Представьтесь, пожалуйста» более этичная форма, чем однословное «Представьтесь!». В этом случае второе выражение вообще звучит как приказ, в то время, как первое выражает просьбу.
Частица
В остальных случаях «пожалуйста» употребляется как частица. Например:
—Можно закрыть окно?
—Пожалуйста.
(Положительный ответ, согласие на просьбу; синоним слова конечно)
—Благодарю вас!
—Всегда пожалуйста!
(В ответ на благодарность разрешение обращаться снова; синоним слова обращайтесь)
И воду для ванны не надо греть в колонке, открыл кран — и пожалуйста!
(В.П.Крапивин «Бабушкин внук и его братья»)
(В данном случае слово пожалуйста означает наличие возможности; синоним слова вот)
Пунктуация
Сложность пунктуации заключается в том, что слово «пожалуйста» не всегда является вводным в предложении. Обособление же запятыми данного слова имеет место только тогда, когда это слово является вводным словом.
Рассмотрим примеры, из которых станет ясно, как писать правильно, когда надо и когда не надо ставить запятые.
Примеры написания
- Выставьте, пожалуйста, счёт на оплату и скиньте его на наш ящик электронной почты, пожалуйста.
- Пожалуйста, подскажите ваш адрес электронной почты и, пожалуйста, отправьте деньги после получения счёта от нас.
Ещё пример:
—Дайте капустки кочанчик-другой!
—Разве так просят? Подумай, косой!
—Дайте, пожалуйста, — вспомнил Зайчишка. —
И, если можно, с большой кочерыжкой!
—Вот молодец! — ему лапу пожали
И самых вкусных кочанчиков дали.
(Марина Дружинина. «Занимательная грамматика»)
В этих примерах слово «пожалуйста» обособляется запятыми, так как вводится для вежливости просьбы.
Синонимы и антонимы
Слово «пожалуйста» имеет фразы синонимы в русском языке. Например: будьте добры, будьте любезны, не сочтите за труд, прошу вас и т.д. В то же время, если это слово выступает как частица, оно может иметь самые разные синонимы, зависящие от контекста. Одновременно с этим слово «пожалуйста» как вводное слово не имеет антонимов. В нашем языке нет слов, противоположных по значению этикетному междометию «пожалуйста».
Заключение
В этой статье мы рассмотрели, как правильно писать слово «пожалуйста». Мы изучили наиболее распространённые ошибки, встречающиеся при написании этого слова, а также освоили правила пунктуации, имеющие место при появлении этого слова в предложении. Если эта статья была вам полезна и интересна, просим Вас поделиться информацией из неё с другими людьми, чтобы они тоже могли правильно писать это повсеместно используемое слово.
4
10 ответов:
28
0
Слово «пожалуйста» всегда на письме обособляется запятыми. Если оно стоит в начале или в конце предложения, то выделяется одной запятой, если в середине, то двумя.
Примеры предложений:
Пожалуйста, не говори глупостей.
Подайте мне, пожалуйста, соль.
Помоги мне сделать это задание по математике, пожалуйста.
В обороте «подскажите пожалуйста» слово «пожалуйста» также обособляется запятыми. Как правило, оборот стоит в начале предложения.
Примеры предложений:
Подскажите, пожалуйста, как пройти к площади Ленина.
Подскажите, пожалуйста, кто автор этого произведения.
Подскажите, пожалуйста, где мне найти заведующего общежитием.
5
0
Слово «пожалуйста» в предложении всегда выделяется запятыми — по этой причине и в случае с «подскажите, пожалуйста» мы тоже поставим запятую и до, и после слова «пожалуйста».
Пример:
Подскажите, пожалуйста, где здесь можно найти кафе?
3
0
Прежде всего, замечу, что приведённая конструкция разговорная, существует стилистически нейтральный вариант с глаголом «сказать», например: «Скажите, пожалуйста, как пройти?»
По существу вопроса: в конструкции «Подскажите, пожалуйста, …» слово «пожалуйста» является вводным, поэтому выделяется/обособляется запятыми.
2
0
Вспоминаю из школьных лет слова учителя русского языка и литературы. «Слово Пожалуйста, всегда выделяется запятыми с двух сторон!» Это слово является вводным словом, и где бы оно не находилось, выделяется всегда запятыми.
Например:
- Скажите, пожалуйста, как проехать к музею?
- Можно, пожалуйста, передать эту книгу.
1
0
Добрый день. Слово «пожалуйста» относится к тем словам, которые обязательно нужно выделять запятыми, и при этом не важно в какой части предложения оно находятся. Если рассмотреть ваш пример, то там тоже после этого слова ставим запятую: «Подскажите, пожалуйста».
1
0
Частица пожалуйста может употребляться в предложении и как вводное слово, поэтому запятыми выделить ее нужно.
Конечно, не только в примере автора, но и во многих других:
подскажите, пожалуйста,
подайте, пожалуйста,
возьмите, пожалуйста,
забери, пожалуйста,
скажи, пожалуйста.
Например:
Скажи мне, пожалуйста, как доехать до автовокзала?
Подскажите, пожалуйста, где у вас в городе столовая или кафе?
1
0
Вводное слово «пожалуйста» в предложении всегда выделяется запятыми с двух сторон, кроме тех случаев, когда «пожалуйста» стоит в начале или в конце предложения (очевидно, что выделяется с одной стороны), или когда слово входит в состав неделимого оборота (всегда пожалуйста; скажи пожалуйста, сходил он за молоком).
В конструкции «подскажите, пожалуйста» также ставится запятая внутри и в конце.
1
0
В данном выражении необходимо поставить знак препинания — запятую, т.е. «подскажите, пожалуйста».
Слово «пожалуйста» является вводным, поэтому выделяется запятыми.
Пример: Помоги, пожалуйста. Возьмите, пожалуйста.
0
0
Когда слово «пожалуйста» в предложении выступает в роли вводного слова, оно обязательно выделяется запятыми.
Подскажите, пожалуйста, как проехать к вокзалу.
Пожалуйста, дайте мне вот эту книгу.
Извини меня, пожалуйста.
0
0
Учитывая то, что вторая часть этого словосочетания > слово «пожалуйста» является вводным, его всегда нужно выделять запятыми, где бы оно не стояло в предложении: в начале (запятую ставим после слова), в середине (выделяется с двух сторон), в конце (запятая ставится перед словом).
В нашем примере — «подскажите, пожалуйста», запятая ставится и перед «пожалуйста» и после него, так как вводное слово стоит в середине предложения.
- Подскажите, пожалуйста, что тут написано?
Читайте также
По моему, сугубо личному мнению, если можно из текста выбросить фразу или словосочетание, или выражение, без ущерба к смыслу самого текста,то, безусловно, это можно (и обязательно нужно!) выделять запятыми с обеих сторон, это к нашему разговору,…
Можете выкинуть ненужный «мусор» из моего ответа и всё, сразу же, станет ясно и понятно!
Выражение «с Вашего позволения» может являться в предложении вводным словосочетанием, а может быть просто частью предложения. В зависимости от этого и можно ответить на вопрос, обособляется это выражение запятыми или нет.
Если это вводное выражение, то есть выражение которое употребляется в виде вежливой формы обращения, тогда оно выделяется запятыми. Я, с Вашего позволения, хотел бы прогуляться.
Если это выражение просто часть предложения, тогда запятые не ставятся. Она приходит сюда только с Вашего позволения.
Всё от контекста зависит. Например: «Это фиаско, без малейшего преувеличения.». Или: «Без малейшего преувеличения будет правдивым то, что после выборов мы снова оказались в полной ж…». Русский язык гораздо глубже и богаче, чем кажется на первый взгляд. Иногда бывает так, что оба варианта написания или произношения могут быть как правильными, так и ошибочными.
Ну все же зависит от контекста.
Например: «Это место было хуже того». Зачем здесь запятая?
Мой совет такой: не заморачивайтесь правилами, слушайте, как звучит.
Если при произнесении слышна некая пауза — значит, там точно должен быть знак препинания. Не обязательно запятая.
Например: «Его здесь нет. Больше того — и никогда не было».
Хотя в данном случае можно поставить и запятую, но тире придает уточнению более сильный акцент.
В общем — если научиться слушать язык, он сам все подскажет.
Я пользуюсь таким правилом, что бы не было сомнений…
Если выделенная запятыми часть текста можно, без потери для текста, выкинуть из предложения, не потеряв его общий смысл, то выделять надо…
И наоборот.
В статье рассказывается о том, в каких случаях используется слово “пожалуйста” в речи, и о том, где необходимо ставить запятую на письме.
«Подскажите пожалуйста» выделяется запятыми
В середине и перед фразой
Если это сочетание стоит не в начале предложения, нужна ли запятая? Да, потому что слово «подскажите» в данном случае является частью сложного – односоставным побудительным предложением, а оно должно отделяться запятой.
- Сколько времени, подскажите, пожалуйста?
- А Иван Сергеевич еще на работе, подскажите, пожалуйста?
В середине и после фразы
Слово «пожалуйста» почти всегда (а в данном контексте всегда) является вводным. А значит, оно выделяется запятыми с двух сторон.
- Подскажите, пожалуйста, во сколько начнется концерт?
- Подскажите, пожалуйста, этот автобус идет до торгового центра?
Междометия и знаки препинания
Междометиями принято называть особую разновидность частей речи. Их главная функция — выражение побуждений. Наиболее распространённые — ах, увы и прочие. Отличительные черты междометий:
- Они не являются членами предложения.
- При написании обособляются с помощью знаков препинания.
- Исходя из того, что хотят выразить в речи, междометия отделяются от других слов восклицательным знаком либо запятой.
- Если слово сопровождается невосклицательной интонацией, его выделяют с помощью запятой. Пример: «Ой, я забыла свою сумку в магазине».
- Внутри сочетаний «ах эти, ай да, ой ты» постановка запятой не требуется. Примеры: «Ах эти чёрные глаза!» «Ай да Пушкин!»
- Междометие «о», стоящее перед обращением, не выделяется знаками препинания. Пример: «О Боже, помоги мне!»
Иногда междометие легко спутать с другими частями речи. Чаще всего это бывает с глаголами:
- Я извиняюсь за своё поведение (извиняюсь — глагол). А как, извиняюсь, ваша фамилия? (междометие).
- Каждый день благодарю судьбу за эту встречу (благодарю — глагол). Нет, благодарю, больше ничего не нужно (междометие).
- Возможно, вы меня никогда не простите (глагол). Простите, вы не в курсе, где здесь вход в метро? (междометие).
- Извините меня за бестактное поведение (глагол). Извините, вы не подскажете, который час?
Особого внимания заслуживает слово «привет». Оно выделяется запятыми с 2 сторон в следующих ситуациях:
- Если в предложении используется при перечислении как однородный член предложения: передали деньги, привет, поздравления.
- Если используется с несколькими обращениями: «Привет, Женя, привет, друг».
- После обращения: «Коля, привет, как дела?»
- Если «привет» написано перед словом-обращением в начале фразы, после междометия ставится запятая: «Привет, сынок, ты уроки сделал?»
Запятую не следует ставить, если слово является членом предложения (чаще всего — дополнением): «Передавай привет всем знакомым, кого встретишь». Если слово входит в состав обращения, оно не выделяется запятой. Пример: «Всем привет».
Если междометие стоит в начале предложения, оно выделяется запятой или восклицательным знаком с одной стороны. В середине предложения слово надо обособлять с обеих сторон.
«Пожалуйста» как вводное слово
При вежливом обращении слово «пожалуйста» используется в значении «прошу вас», «будьте добры» и других синонимичных выражений.
В этом случае «пожалуйста» выделяется запятыми.
Если данное слово стоит в начале предложения, запятая ставится после:
Пожалуйста, без ваших вздохов, Аркадий Просперович: раз не дают, значит, нельзя. (Л. Н. Андреев. «Екатерина Ивановна»)
Пожалуйста, сюда. (Л.С. Петрушевская. «Три девушки в голубом»)
Пожалуйста, папочка, дорогой, позови бабу-ягу! (Кир Булычев. «Девочка с Земли»)
Если в конце предложения – запятая ставится перед ним:
Пройдите, пожалуйста (Владимир Дудинцев. «Белые одежды»)
Простите, пожалуйста. Я случайно. (Андрей Геласимов. «Год обмана»)
Если слово стоит в середине предложения, то запятые ставят с обеих сторон:
Скажите, пожалуйста, отчего это вашу тяжёлую тележку четыре быка тащат шутя, а мою, пустую, шесть скотов едва подвигают с помощью этих осетин? (М.Ю. Лермонтов. «Герой нашего времени»)
Послушай-ка, милая, подвези нас, пожалуйста, в своих санях. Я тебя за это по-королевски награжу! (С.Я. Маршак. «Двенадцать месяцев»)
Привет, Дима. Принеси, пожалуйста, водки. (Александр Вампилов. «Утиная охота»)
Слово «пожалуйста» в значении ВС
Примечание: По морфологическим свойствам слово «пожалуйста» является частицей. Но в речи «пожалуйста» часто используется именно как ВС в значении вежливого эмоционального усиления просьбы или предложения.
Частица «пожалуйста» обособляется как вводное слово в форме (значении) вежливого обращения или просьбы; побуждения к определенным действиям; выражения недовольства или негативного отношения говорящего к происходящему действию.
ВС «пожалуйста» в предложении логически выделяет или же эмоционально усиливает предыдущее слово, к которому вводное слово относится. Поэтому частицу «пожалуйста» принято обособлять запятыми как ВС.
Например:
Как же ты мне надоел! Оставь меня в покое, пожалуйста.
Дорогие гости, проходите, пожалуйста, в гостиную и чувствуйте себя как дома.
Аккуратнее, пожалуйста, вы так мне всю обувь испачкаете.
В зале соблюдайте тишину, пожалуйста.
Подскажите, пожалуйста, как мне найти этот подъезд.
Ты видел, как она себя ведет? Пожалуйста, полюбуйся! Все твое воспитание виновато!
Часть речи и роль в предложении
1 Частица:
- используется в диалогах для ответа на благодарность или извинение, а также для выражения согласия.
- синонимична словам «да», «конечно».
– Можно взять вашу ручку?
– Пожалуйста.
Или:
– Можно взять вашу ручку?
– Конечно.
— Вы можете подменить меня завтра на работе?
— Утром – пожалуйста, а в обеденное время я не смогу.
Или:
— Вы можете подменить меня завтра на работе?
— Утром – да, а в обеденное время я не смогу.
— Спасибо, что пропустили меня без очереди.
— Пожалуйста, я всё равно не тороплюсь.
– Передайте хлеб.
– Вот, пожалуйста.
2 Вводное слово:
- используется для придания вежливого оттенка просьбе, а также для усиления этой просьбы;
- синонимично сочетанию «прошу тебя».
Скажите, пожалуйста, как найти остановку автобуса?
Ну отдай мне книгу, ну пожалуйста!
Или:
Ну отдай мне книгу, ну прошу тебя!
3 «Скажите пожалуйста», «здравствуйте пожалуйста» — междометные выражения, которые:
- используются, чтобы выразить возмущение, удивление, гнев;
- не имеют внутренних запятых;
- могут выделяться в отдельное восклицательное предложение для придания высказыванию большей эмоциональности.
Скажите пожалуйста, какая честная нашлась!
Или:
Скажите пожалуйста! Какая честная нашлась!
Здравствуйте пожалуйста! Опять меня не предупредили!
«Пожалуйста» как отдельное предложение
Нередко «пожалуйста» оформляют в виде отдельного предложения. Это слово может означать вежливое согласие, реакцию на благодарность или принесенные извинения.
Пожалуйста! На, бери, ешь! (Л.Н. Разумовская. «Счастье»)
– Спасибо за расческу.
– Пожалуйста. (Кир Булычев. «Девочка с Земли»).
– Прошу ближе к существу проекта, к его основным особенностям.
– Пожалуйста. Наша машина имеет два коренных отличия. (Владимир Дудинцев. «Не хлебом единым»)
– Пожалуйста! – горячо зашептал он. – Пока еще не поздно! (Дмитрий Глуховский. «Метро 2033»)
«Пожалуйста» или «пожалуйсто»?
Следует запомнить, что слово «пожалуйста», независимо от контекста, всегда пишется с «а» на конце. Варианта «пожалуйсто» не существует.
«Пожалуйста» частица: правила постановки знаков препинания
- Если частица используется в реплике для выражения вежливого ответа на просьбу, извинения или благодарности за что-то — слово «пожалуйста» оформляется в отдельное предложение.
Например:
«Я возьму ее с собой?» — «Пожалуйста.»
«Можно я пройду?» — «Ой, конечно! Пожалуйста!»
«Спасибо за помощь!» — «Пожалуйста.»
«Можно кое-что рассказать?» — «Пожалуйста.»
- Если частица употребляется в значении «конечно» (обстоятельство или возможность чего-либо) и находится в середине предложения, тогда слово отделяется тире.
Например:
Сегодня — пожалуйста, но завтра — вы меня не заставите работать.
Пять рублей — пожалуйста, но все отдавать я не собираюсь.
- Если частица употребляется в речи при передаче предмета или вещей, тогда слово выделяется одной запятой.
Например:
— Пожалуйста, ваш чай с лимоном.
— Передайте мне соль. — Вот, пожалуйста.
- Если частица используется для выражения сильной просьбы или небольшого требования, тогда слово не выделяется запятыми.
Например:
Хочу этого зайчика! Купите мне его. Ну пожалуйста! Я буду себя примерно вести!
Он забрал мою игрушку! Пускай он вернет мне ее сегодня же! Ну пожалуйста!
Правила пунктуации со словом «пожалуйста»
Частица
1 Частица «пожалуйста» чаще всего выделяется в отдельное предложение в качестве ответной реплики в диалоге.
— Благодарю за помощь.
— Пожалуйста.
— Не передадите мне сдачу?
— Пожалуйста.
2 Если всё же частица не единственное слово в предложении, то она отделяется запятой.
— Вы не придержите мне дверь?
— Да, пожалуйста.
— Спасибо.
– Передайте мне, пожалуйста, это варенье.
– Пожалуйста, возьмите.
3 «Пожалуйста», употребляемое в значении «да» в ответ на просьбу, от стоящего перед ним слова запятой не отделяется.
– Ты сможешь завтра сходить вместе со мной в паспортный стол?
– Я пожалуйста.
4 Если после слова следуют другие члены предложения, то они отделяются запятой.
Если завтра – пожалуйста, но сейчас никак не могу.
Окна пожалуйста, а дверей у нас в продаже нет.
5 В некоторых случаях по авторскому замыслу перед «пожалуйста» может стоять тире. Тогда при чтении выдерживается интонационная пауза.
— Вы с Пашей мне завтра поможете?
— Я – пожалуйста, а вот насчёт Паши ничего сказать не могу.
Вводное слово
В роли вводного слова «пожалуйста» выделяется запятыми по следующим правилам:
1 Одиночное вводное слово обособляется независимо от своего расположения в предложении.
Пожалуйста, не пролей суп.
Подскажите, пожалуйста, как пройти на площадь Маяковского.
Помоги мне с домашним заданием, пожалуйста.
2 Если перед «пожалуйста» стоят сочинительные союзы «и», «но», «а», «да» (в значении «и»), а также частица «ну», то, как правило, они не разделяются запятой.
Вот, возьми деньги на продукты, но пожалуйста, сдачу принеси обратно.
Приберись дома, пока я буду в магазине, и пожалуйста, не отвлекайся на интернет.
И пожалуйста, не задерживайся сегодня после школы: бабушка будет ждать нас к ужину.
Давай ещё немного почитаем, ну пожалуйста!
Междометные выражения
Выражения «здравствуйте пожалуйста» и «скажите пожалуйста», используемые для передачи эмоций, на письме отделяются от других членов предложения запятой либо являются отдельными восклицательными предложениями. При этом внутри таких выражений знаки препинания не ставятся.
Скажите пожалуйста, какой деловой!
Здравствуйте пожалуйста! Я же сказала, что у меня уже планы на вечер!
Если выражение используется вместе с частицей «ну», запятая между ними не нужна.
Ну скажите пожалуйста, как удобно ты устроился!
Ну здравствуйте пожалуйста, вот так ты меня слушаешь!
Важно! Следует различать случаи, когда перед нами междометное выражение и вводное слово.
Сравните:
Скажите пожалуйста, как всё складно да ладно у вас!
Но:
Скажите, пожалуйста, как дойти до библиотеки.
Здравствуйте пожалуйста, явился — не запылился!
Но:
Здравствуйте! Пожалуйста, взвесьте мне килограмм яблок.
А вы знаете..
Какой из вариантов правильный?
(по статистике прошлой недели только 40% ответили правильно)
Написание фразы добрый день
Чтобы определить, нужна ли запятая после «добрый день», необходимо выяснить лексическое значение этого сочетания и его место в предложении.
Если этикетное междометие пишется в начале фразы, после него всегда ставится запятая. Следующим словом во фразе чаще всего бывает обращение. Его всегда выделяют на письме запятой, в какой части предложения оно бы ни находилось. Пример: «Добрый день, дорогие коллеги». «Добрый день, господин Петров».
Если вежливое обращение употребляется в середине предложения, оно выделяется запятой с обеих сторон. Если в конце фразы стоит этикетное сочетание «добрый день», знаки препинания ставятся перед ним.
Чтобы выбрать, как говорить правильно — добрый день или доброго дня, необходимо учитывать контекст и статус того, к кому обращается. Если необходимо что-то сказать или написать партнёру, руководителю, коллеге, лучше выбрать первый вариант. При обращении к друзьям или родным допустима вторая конструкция.
«И пожалуйста»
К частице «пожалуйста» для логического усиления можно добавить присоединительный союз: «и», «а», «но», «да». В этом случае оба слова становятся единой конструкцией и обособляются вместе:
Не хотите с нами работать? И пожалуйста!
Да пожалуйста, он уйдет, пожалуйста! (Л.С. Петрушевская. «Уроки музыки»)
То же самое – если для усиления используется частица «ну»:
Ну пожалуйста, давай пойдем в кино!
В редких случаях, если автор хочет выделить вводные слова интонационно, он может поставить запятую после присоединительного союза:
И, пожалуйста, не делайте так больше.
«Пожалуйста» в составе цельного выражения: нужно ставить запятые?
Междометное выражение «скажи(те) пожалуйста» используется в речи для выражения сильного возмущения, иронии, негодования или удивления — в предложении все междометное выражение выделяется запятыми.
…(,) скажите пожалуйста (,)…
или: … Скажите пожалуйста! …
Например:
Скажите пожалуйста, как мы вырядились!
Ему таки все равно? Скажите пожалуйста, куда этот дурак свой нос так задрал!
Скажите пожалуйста, как он расфуфырил свои перья перед нами!
Что он за человек такой? Скажите пожалуйста! Высший уровень ему подавай!
В выражениях «ну и пожалуйста», «да и пожалуйста» — слово «пожалуйста» не отделяется, в предложении выделяется все сочетание. Эти выражения выражают недовольство или обиду.
…(,) ну и пожалуйста(,)…
Например:
Ах, ну и пожалуйста, гуляй теперь с ней сам!
Сочетание «и пожалуйста» при логическом выделении в предложении обособляется запятыми.
…(,)и пожалуйста(,)…
Например:
Вот на соседа своего посмотри, работает усердно же человек, и пожалуйста, уважаемый он всеми в деревне.
Больше примеров для усвоения материала
«скажите пожалуйста»
Скажите пожалуйста, какие мы деловые! — междометное выражение
Скажите, пожалуйста, где здесь продуктовый магазин? — вводное слово
«извините пожалуйста»
Извините, пожалуйста, я не хотел вас задеть. — вводное слово
«пришлите пожалуйста»
Пришлите, пожалуйста, ваше деловое предложение мне на почту. — вводное слово
«посмотрите пожалуйста»
Посмотрите, пожалуйста, нет ли у вас на складе нужных мне подгузников. — вводное слово
Случаи, когда запятая не нужна
Существует несколько ситуаций, когда словосочетание не обособляется запятыми. Если выражение составляет отдельную фразу, в конце ставится восклицательный знак или точка: «Здравствуйте». «Приветствую».
Если сочетание не является междометием, этикетной конструкцией, оно входит в состав предложения, связано грамматически с другими его членами. К нему можно задать вопрос от других членов предложения. Примеры: «Такой добрый вечер не может не запомниться». «Прощайте тех, кто вас обидел, и на душе всегда будет легко». «До свидания Маши с Сергеем оставалось ещё несколько часов». «Передавайте большой привет вашей маме».
Когда запятая не нужна: «пожалуйста» как междометие или согласие
Запятая не ставится между частями междометных выражений «скажи пожалуйста» и «скажите пожалуйста»:
– Я хочу их разбудить…
– Скажите пожалуйста! (Булат Окуджава. «Новенький как с иголочки»)
Милая… Скажите пожалуйста… Милую нашёл… (Сергей Довлатов. «Заповедник»).
Также запятая не нужна, если «пожалуйста» используется в значении «да» для выражения согласия. Обычно в этом случае ставится тире:
Нет, сегодня он не пойдет туда! Завтра – пожалуйста, а сегодня он сходит в хутор, проживет этот день с детьми, увидит Аксинью и утром вернется в Вешенскую. (М.А. Шолохов. «Тихий Дон»).
– Одну. За первое утро.
– Ни одной. Завтра – пожалуйста. Хоть сто порций. (Александр Вампилов. «Утиная охота»).
Тест
Тест на тему: «Запятые со словом пожалуйста»
Часть 1. Вступление
…
Часть 6. Специфика Google
Часть 7. Ещё возможности C++
Часть 8. Именование
…
Это последняя переведённая часть руководства Google по стилю в C++.
Спасибо за замечания и комментарии к переводу.
Надеюсь это руководство будет полезным подспорьем для программистов на C++.
Исходная статья (fork на github), обновляемый перевод.
И ещё здесь много букв.
Ещё возможности C++
Rvalue-ссылки
Используйте rvalue-ссылки:
- Для объявления конструкторов перемещения и операторов перемещения.
- Для объявления перегружаемых функций с const& и && аргументами если это обеспечит значительное улучшение производительности против передачи по значению или если пишется код с небольшими накладными расходами или поддержкой произвольных типов. Избегайте увеличения количества перегружаемых функций (обычно бывает, когда комбинируются типы для несколько параметров).
- Для поддержки ‘perfect forwarding’ в ‘универсальном’ коде.
Определение
Rvalue-ссылка является ссылочным типом, привязанным к временному объекту. По синтаксису похожа на обычную ссылку. Например, void f(std::string&& s); объявляет функцию с аргументом rvalue-ссылка на std::string.
Когда суффикс ‘&&’ (без дополнительных квалификаторов) используется с шаблонным аргументом функции, то применяются специальные правила определения типа аргумента. И такая ссылка имеет название forwarding reference.
За
- Определение конструктора перемещения (принимающего rvalue-ссылку на тип класса) даёт возможность переместить (move) класс вместо его копирования. Например, если v1 это std::vector<std::string>, то код auto v2(std::move(v1)) скорее всего выполнит несколько операций с указателями вместо копирования большого объёма данных. И в большинстве случаев это приведёт к существенному увеличению производительности кода.
- Rvalue-ссылки позволяют реализовать типы, которые можно перемещать, а не копировать. Это полезно для типов, которые нельзя копировать, но которые хочется передавать в функцию как аргумент, хранить в контейнере и т.д.
- Функция std::move необходима для эффективного использования некоторых типов стандартной библиотеки, таких как std::unique_ptr.
- Forwarding references, использующие объявление rvalue-ссылки, позволяют написать единую обёртку, перемещающую аргумент в другую функцию. И это одинаково работает вне зависимости от того, временный объект или нет, константный он или не очень. Это и называется ‘perfect forwarding’.
Против
- Rvalue-ссылки не все хорошо понимают. Особенности, наподобие схлопывания ссылок или специальных правил определения типа, всё сильно усложняют.
- Rvalue-ссылки часто используют неправильно, т.к. они интуитивно нелогичны: обычно ожидается, что аргумент будет иметь валидное состояние после вызова функции (и операции перемещения выполняться не будут).
Вердикт
Вы можете использовать rvalue-ссылки чтобы объявить конструктор перемещения и перемещающий оператор присваивания (как описано в Копируемые и перемещаемые типы). См. также C++ Primer для более подробной информации о семантике перемещения и, также, std::move.
Вы можете использовать rvalue-ссылки чтобы объявить пары перегружаемых функций, одна с Foo&&, другая с const Foo&. Обычно программисты предпочитают передавать аргументы по значению. Однако использование пары функций может дать лучшую производительность, или позволит в обобщённом коде поддержать большое количество типов. И не забывайте: если ради производительности пишется более сложный код, проверьте и убедитесь, что это действительно помогает.
Вы можете использовать ‘forwarding references’ вместе с std::forward
, чтобы реализовать ‘perfect forwarding’.
Дружественные сущности
В ряде случаев допустимо использовать классы и функции как friend.
Дружественные типы обычно определяются в том же файле, поэтому нет необходимости открывать другой файл, чтобы разобраться с использованием закрытых членов класса. Обычное использование friend: когда класс FooBuilder объявляется дружественным (friend) классу Foo, так что FooBuilder может корректно настроить внутреннее состояние Foo без необходимости открывать это состояние всем остальным. В ряде случаев удобно сделать класс unit-тестов дружественным исходному классу.
Дружественность расширяет (но не ломает) инкапсуляцию класса. В ряде случаев, когда требуется дать доступ к внутреннему состоянию только одному классу, лучше объявить его как friend, чем делать дополнительные открытые члены класса. Однако, в остальном классы должны взаимодействовать только через открытые функции.
Исключения (программные)
Мы НЕ используем исключения C++.
За
- Исключения позволяют обрабатывать ситуации типа «это невозможно» не в месте возникновения ошибки, а на более верхнем уровне, позже. И всё это без копания в исходниках и составления таблиц с кодами ошибок.
- Исключения используются в большинстве современных языков программирования и их использование в C++ позволяет писать код, концептуально схожий с Python, Java и др.
- Некоторые библиотеки C++ используют исключения в своей работе и отказ от них может существенно усложнить интеграцию с этими библиотеками.
- Исключения являются единственным способом проинформировать о проблемах в конструкторе класса. Конечно, это можно обойти, используя фабричные методы или метод Init(), однако это потребует либо дополнительного выделения памяти или, соответственно, обработку специального «невалидного» состояния.
- Исключения очень удобны при использовании в тестировании (в тестовых фреймворках).
Против
- Если используется throw в функции, то вы должны проверить всех, кто эту функцию вызывает. Должна быть базовая гарантия безопасности при исключениях. Или же код никогда не ловит исключения и тогда программа может внезапно завершиться. Например есть код, где f() вызывает g(), который вызывает h(). Если h выбрасывает исключение, которое отлавливает f, то g нужно писать аккуратно, иначе могут быть утечки ресурсов и т.д.
- Обычно использование исключений усложняет отслеживание последовательности выполнения кода. Например, функции могут завершаться в неожиданных местах. Это затрудняет поддержку кода и его отладку. Вы можете улучшить ситуацию, следуя (своим) правилам когда и где можно использовать исключения. Однако, очень желательно, чтобы и другие разработчики знали об этих правилах.
- Безопасное использование исключений требует использования дополнительных принципов кодирования, например, RAII. И их количество (принципов кодирования) может быть значительным. Например, чтобы разработчик не разбирался в тонкостях всей цепочки вызовов неизвестного ему кода, желательно выделить код сохранения данных в хранилище в отдельную фазу-фиксацию. Такое выделение может нести как плюсы, так и минусы (э-э-э, корпоративная политика смешивания кода в одну кучу для удобства обсфуркации?). В любом случае, использование исключений уменьшает количество доступных вариантов.
- Использование исключений ведёт к распуханию бинарного файла программы, увеличивает время компиляции (иногда только чуть-чуть) и вообще может привести к проблемам с адресным пространством.
- Само наличие исключений может провоцировать разработчиков выбрасывать их по поводу и без повода, даже когда это не нужно или может привести к сложностям в обработке. Например, если пользователь вводит неподходящий текст, это не должно приводить к выбрасыванию исключения. И вообще, если всё это расписывать, то никакого документа не хватит!
Вердикт
Для новых проектов преимуществ от использования исключений обычнобольше, чем недостатков. Однако, для уже существующего кодавведение исключений может повлиять на весь код. Также могут возникнутьпроблемы стыка нового кода и старого (без исключений) кода.
Т.к. большинство C++ кода в Google не использует исключений, то очень проблематично будет внедрять новый код, который будетгенерировать исключения. Существующий код в Google не может корректно работать с исключениями, поэтому цена внедрения исключений намного выше, чем реализация любого нового проекта. Переписывание существующего кодапод обработку исключений — это будет очень медленный процесс, с большим количеством ошибок. Поэтому лучше использовать альтернативу в виде возврата кода ошибки и assert-ов: это не так сложно.
Этот запрет также распространяется на добавленные в C++11 возможности, такие как std::exception_ptr и std::nested_exception.
Однако, для кода под Windows есть послабления.
noexcept
Указывайте noexcept, если это корректно и будет полезно.
Определение
Спецификатор noexcept используется для указания, что функция не будет выбрасывать исключения. Если же функция с таким спецификаторомвсё же выбросит исключение, то произойдёт крэш программы через std::terminate.
Также есть оператор noexcept. Он выполняет проверку: объявлено ли выражениекак «не выбрасывающее исключений». Проверка проводится на этапе компиляции.
За
- Спецификация конструктора перемещения как noexcept может улучшить производительность в ряде случаев, например std::vector<T>::resize() скорее переместит объект нежели скопирует его, если конструктор перемещения для типа T заявлен как noexcept.
- Указание noexcept для функций может разрешить дополнительную оптимизацию, например компилятор может не генерировать код по раскрутке стека. Конечно, это имеет смысл, если в целом исключения разрешены.
Против
- Если проекты следуют данному руководству и в них исключения запрещены, то очень сложно проверить правильность спецификатора noexcept, если вообще применимо понятие правильности.
- Вы не можете безболезненно удалить ранее прописанный спецификатор noexcept, т.к. это аннулирует гарантию, на которую может полагаться другой код, причём полагаться весьма замысловатыми способами.
Вердикт
Используйте noexcept, когда это может улучшить производительность и точно отражает семантику функции (если из функции вылетело исключение, то это явная, фатальная ошибка).Считается, что noexcept на конструкторе перемещения может существенно улучшить производительность, учитывайте это.Если вы рассчитывайте на значительный прирост производительностиот применения noexcept для других функций, пожалуйста, сначала проконсультируйтесь с руководителем проекта.
Используйте безусловный noexcept, если исключения полностью запрещены (т.е. в типовом проекте C++ в Google).В ином случае, используйте спецификатор noexcept сусловиями (желательно простыми), которые становятся false в тех редких случаях, когда функция может всё-таки выбросить исключение.Эти тесты могут пользоваться проверками на характеристики типов(например, std::is_nothrow_move_constructible дляобъектов создаваемых через конструктор перемещения) или аллокаторов(например, absl::default_allocator_is_nothrow). Отметим, что наиболее частая причина исключений — невозможностьвыделения памяти (и да, мы верим, что это не относится к конструкторамперемещения — они не должны выбрасывать исключений из-за ошибок выделения памяти) и есть много приложений, для которых эта ситуацияозначает фатальную ошибку, которую даже не имеет смысла обрабатывать.И даже в других, потенциально ошибочных, ситуациях рекомендуетсяделать упор на простоту интерфейса, нежели на поддержку всех сценариевобработки ошибок: например, вместо написания накрученного noexceptс зависимостью от внешней хэш-функции (выбрасывает она исключения или нет), можно просто задокументировать, что разрабатываемый компонент не поддерживает хэш-функции, которые выбрасывают исключения. И, после этого, использовать noexcept без всяких дополнительных условий.
Информация о типе во время выполнения (RTTI)
Не используйте информацию о типе во время выполнения (RTTI).
Определение
RTTI позволяет запросить информацию о C++ классе объектаво время выполнения. Делается через typeid илиdynamic_cast.
За
Типовые альтернативы вместо RTTI (описано ниже)требуют модификации или редизайна иерархии классов, участвующих в запросах. Иногда такую модификацию очень тяжело сделать, или она нежелательна, особенно в коде, который уже используется в других проектах.
RTTI может быть полезен для юнит-тестов. Например, можнотестировать классы-фабрики на правильность сгенерированного типа.Также это полезно в выстраивании связей между объектами и ихмакетами (mock).
RTTI бывает полезно при работе с абстрактными объектами. Например:
bool Base::Equal(Base* other) = 0;
bool Derived::Equal(Base* other) {
Derived* that = dynamic_cast<Derived*>(other);
if (that == nullptr)
return false;
...
}
Против
Часто сам запрос типа объекта в процессе выполнения означает проблемы с дизайном приложения, показывает наличие изъянов виерархии классов.
Бесконтрольное использование RTTI усложняет поддержку кода.Это может привести в развесистым условиям, которые зависят от типа объекта, которые рассыпаны по всему коду. И которые придётся досконально изучать если будет необходимость что-то изменить в этом коде.
Вердикт
Использование RTTI может легко привести к злоупотреблениям, поэтому будьте аккуратны. Старайтесь ограничить использование RTTI только юнит-тестами. Рекомендуется отказаться от RTTIв новом коде. Если же требуется написать код, которыйведёт себя по разному в зависимости от типа объекта, возможно следующие альтернативы будут более подходящими:
- Виртуальные методы. Это предпочтительный способ для выполнения различного кода в зависимости от типа объекта. И вся работа (код) делается в самом объекте.
- Если код должен находится вне объектов, то можно использовать подходы, аналогичные двойной диспетчеризации, например шаблон проектирования Посетитель/Visitor. Это позволит внешнему коду самому определять тип объектов (используя систему типов).
Когда логика программы гарантирует, чтополученный указатель на базовый класс фактически есть указательна определённый производный класс, тогда можно свободно использоватьdynamic_cast. Правда, в этом случае лучше использоватьstatic_cast.
Большое количество условий, основанных на типе объекта, естьпоказатель явных проблем в коде.
if (typeid(*data) == typeid(D1)) {
...
} else if (typeid(*data) == typeid(D2)) {
...
} else if (typeid(*data) == typeid(D3)) {
...
Подобный код может рассыпаться, когда добавляется новый дочерний класс в иерархию. И вообще, очень тяжело модифицироватьбольшое количество разрозненных кусков кода в случаенебольших изменений в свойствах или методах дочерних классов.
И пожалуйста, не изобретайте собственный велосипед на замену RTTI. Аргументы против собственного решения будут такие же (см. выше), да и разбираться в чужих велосипедах обычно сложнее.
Приведение типов / Casting
Рекомендуется использовать приведение типов в C++-стиле: static_cast<float>(double_value). Также можно использовать инициализацию значением в скобках для преобразования арифметических типов: int64 y = int64{1} << 42. Избегайте конструкций вида int y = (int)x или int y = int(x) (хотя последний вариант допустим при вызове конструктора класса).
Определение
В C++ приведение типов расширяется по сравнению с чистым C путём добавления операций приведения.
За
Основная проблема с приведением типов в чистом C — неоднозначность операции. Например, одинаково записанная операция: (int)3.5 и (int)«hello» сильно отличается по смыслу. Инициализация в скобках и операции в стиле C++ часто помогают избежать такой неоднозначности. Дополнительная плюшка: операции приведения в стиле С++ легче искать по коду.
Против
C++-стиль довольно громоздкий.
Вердикт
Избегайте использования приведения типов в стиле чистого C. Вместо этого используйте стиль C++ когда требуется явное преобразование типов.
- Используйте инициализацию в скобках для преобразования арифметических типов (int64{x}). Это самый безопасный способ, т.к. в других случаях (при потере информации при конвертации) код может не скомпилироваться. Плюс лаконичный синтаксис.
- Используйте static_cast как эквивалент преобразований в C-стиле или когда необходимо преобразовать указатель на дочерний класс в указатель на базовый и обратно (указатель на базовый класс преобразовать в указатель на дочерний (и желательно, чтобы сам объект был экземпляром дочернего класса)).
- Используйте const_cast чтобы убрать квалификатор const (см. const).
- Используйте reinterpret_cast чтобы небезопасно преобразовать указатели к целым числам или указателям другого типа. Используйте эту операцию только если вы знаете, что делаете и понимаете проблемы с выравниванием. Также, можете использовать в таких случаях absl::bit_cast.
- Используйте absl::bit_cast для приведения «сырых» битов в другой тип такого же размера (например, если требуется интерпретировать double как int64).
Также может быть полезным раздел RTTI с описанием dynamic_cast.
Потоки / Streams
Используйте потоки в подходящих случаях, особенно если их использование упрощает код. Перегружайте операцию << только для типов-значений и выводите в поток собственно данные (доступные пользователю). Не выводите в поток внутренние переменные (инварианты и т.д.) и другие детали реализации.
Определение
Потоки являются стандартной абстракцией для ввода/вывода в C++, (см. стандартный заголовочный файл <iostream>). Они часто используются в коде в Google, особенно для отладочного логирования и диагностики.
За
Операторы << и >> реализуют форматированный ввод/вывод, они просты в понимании, портабельны, расширяемы и повторно используемы. Противоположность к ним — printf, который даже не поддерживает работу с std::string. Кроме того не работает с пользовательскими типа и с портабельностью там проблемы. Кроме того, printf вынуждает выбирать среди похожих версий одной функции и ориентироваться в десятках форматных символах.
Потоки обеспечивают хорошую поддержку консольного ввода/вывода через std::cin, std::cout, std::cerr и std::clog. Функции из C API тоже хорошо работают, однако могут требовать вручную буферизировать ввод.
Против
- Форматирование потоков можно настроить через манипуляторы, изменяющие состояние потока. Учтите, применение манипуляторов сохраняется во времени и, как результат, поведение кода зависит от истории использования потока (или необходимо будет всё восстанавливать в известное состояние после каждого случая возможного применения манипуляторов). Кроме того, пользовательский код может (помимо модификации встроенных параметров) создавать собственные манипуляторы, добавлять переменные состояния и изменять поведение через функционал register_callback.
- Проблематично полностью контролировать вывод потока: смена настроек (см. выше), вывод мешанины из параметров и собственно данных, использование перегрузки операторов (и компилятор может выбрать не ту перегрузку, которая предполагалась) — всё это не добавляет управляемости.
- Формирование вывода посредством вызова цепочки операторов << затрудняет локализацию, т.к. при этом жёстко, прямо в коде, фиксируется порядок слов. И средства поддержки локализации лишаются ценности.
- Потоковый API может быть сложным, с тонкостями. И программисты должны уметь с ним работать, чтобы код был эффективным.
- Выбор правильной версии оператора << из большого количества аналогичных является для компилятора затратным. При частом их использовании в большой кодовой базе, время парсинга и анализа может отъедать до 20% времени.
Вердикт
Используйте потоки только если они являются наилучшим решением. Обычно это варианты ввода/вывода в человекочитаемый формат, предназначенный для разработчиков, а не для конечного пользователя. Также не забывайте, что в проекте уже могут быть устоявшиеся методы ввода/вывода — старайтесь использовать их. В частности, библиотеки для логирования и диагностического вывода обычно предпочтительнее нежели std::cerr или std::clog. И вместо std::stringstream лучше использовать absl/strings или их эквивалент.
Не рекомендуется использовать потоки для ввода/вывода в случае обмена данными с конечными пользователями или где возможно нарушение формата или валидности данных. В таких случаях используйте подходящие (шаблонные) библиотеки, которые корректно обрабатывают интернационализацию, локализацию, проверяют корректность данных и формата.
Если потоки всё же используются, старайтесь избегать API работы с состояниями, кроме состояния ошибки. Т.е. не используйте imbue(), xalloc() и register_callback(). Рекомендуется использовать явные функции форматирования (см. absl/strings) вместо манипуляторов или флагов форматирования для таких вещей как смена основания системы счисления, точности или набивка нулями до нужного размера чисел.
Перегружайте оператор << только для типа-значения с тем, чтобы оператор выводил человеко-читаемое представление. Не выводите в поток детали реализации или внутренние переменные. Если же требуется отладочная печать внутреннего состояния, то используйте обычные функции-методы (например, метод класса DebugString() — подходящий вариант).
Преинкремент и предекремент
Используйте префиксные формы (++i) инкремента и декремента над итераторами и другими шаблонными объектами.
Определение
Когда переменная инкрементируется (++i, i++) или декрементируется (—i, i—), а возвращаемое значение не используется, то необходимо чётко понимать: использовать префиксную форму (++i, —i) или постфиксную (i++, i—).
За
Когда возвращаемое значение игнорируется, то префиксная форма не менее эффективна постфиксной (чаще префиксная более эффективна). Связано это с тем, что постфиксная реализация должна сделать копию переменной с исходным значением для возврата результата. Если переменная является итератором или другим сложным типом, то копирование её может быть затратным по ресурсам. Поэтому, если обе формы ведут себя одинаково (возвращаемое значение игнорируется), почему бы не использовать всегда префиксную форму?
Против
Традиционно раньше в разработке (особенно на языке C) использовалась постфиксная форма, особенно для циклов for. Иногда программистам легче читать код с постинкрементом, т.к. «субъект» (i) стоит перед «действием» (++), как в английском предложении.
Вердикт
Для простых скалярных (не-объектов) типов нет особой разницы в использовании префиксной или постфиксной формы. Для итераторов и других шаблонных типов используйте префиксную форму.
Использование const
В API используйте const когда это имеет смысл. В ряде случаев constexpr будет лучшей альтернативой const.
Определение
При объявлении переменных или параметров вначале может быть указано const, чтобы показать что переменные не изменяются (например, const int foo). Функции класса могут быть с квалификатором const, чтобы показать, что эта функция не изменяет состояние членов класса (например, class Foo { int Bar(char c) const; };).
За
Позволяет легко понять, как использовать переменные. Компиляторам даёт возможность полнее контролировать типы и, теоретически, генерировать лучший код. Использование констант даёт дополнительную защиту (уверенность) в корректности кода: функции не могут модифицировать переменные, изменять состояние класса и, как результат, можно безопасно работать без локов в многопоточном окружении.
Против
Использование const оно «заразное»: если передаётся const переменная в функцию, то она должна в прототипе иметь указание на const (или придётся делать const_cast). И это может быть проблемой при вызове библиотечных функций.
Вердикт
Настоятельно рекомендуется использовать const в API (параметры функций, методы, не-локальные переменные), где это имеет смысл. Такой подход даёт понятное (и верифицируемое компилятором) описание как можно модифицировать объекты. Чёткое разделение на модифицирующие (запись) и не-модифицирующие (только чтение) операции очень полезно, особенно для написания потокобезопасного кода. В частности:
- Если функция не меняет аргумент, переданный по ссылке или указателю, то он должен быть ссылкой на константу (const T&), либо указателем на константу (const T*).
- Если параметр передаётся по значению, то использование const не даёт никакого эффекта. Поэтому не рекомендуется объявлять константный параметр. См. также TotW #109.
- Старайтесь объявлять члены класса константными (const) если они не изменяют логическое состояние объекта (и не дают возможности другим что-то менять, например через возврат не-константной ссылки). В противном случае эти методы могут быть небезопасными в многопоточном окружении.
Использование const для локальных переменных отдаётся на усмотрение программиста: можно использовать, можно — нет.
Все const операции класса должны работать корректно при одновременном вызове нескольких функций. Если это не выполняется, то класс должен быть явно описан как «потоко-не-безопасный».
Местоположение const
Иногда используется форма int const *foo вместо const int* foo. Обосновывается это тем, что первая форма более логична: const следует за описываемым объектом. Однако, такая «логичность» имеет мало смысла (и обычно не применяется в коде с несколькими вложенными маркерами «указатель»), т.к. чаще всего есть только один const для базового значения. В таком случае нет необходимости специально заботиться о логичности. Размещение же const вначале делает код более читабельным и согласованным с английским языком: прилагательное (const) стоит перед существительным (int).
Так что расположение const вначале является предпочтительным. Однако, это не жёсткое условие и если остальной код в проекте использует другой порядок — следуйте за кодом!
Использование constexpr
Используйте constexpr для определения констант или чтобы сделать константную инициализацию.
Определение
Переменные можно объявлять как constexpr для указания на константу, значение которой определяется во время компиляции или линковки. Также можно объявлять функции и конструкторы как constexpr, чтобы их можно было использовать для определения переменной с constexpr.
За
constexpr позволяет определять выражения с плавающей запятой (помимо литералов), использовать константы для пользовательских типов и вызовов функций.
Против
Использование constexpr может вызвать проблемы с поддержкой кода (или миграцией), если константность нужно будет позже убрать. Текущие ограничения для константных функций или конструкторов могут потребовать реализации дополнительных обходных путей в коде.
Вердикт
constexpr позволяет определить неизменяемые части интерфейса. Используйте constexpr чтобы определить константы и функции для задания им значений. Не используйте constexpr, если это потребует усложнения кода. Не используйте constexpr, чтобы сделать код «встраиваемым» (inlining).
Целочисленные типы
Среди встроенных целочисленных типов C++ необходимо использовать int. Если в программе требуется переменная другого размера, то используйте целочисленные типы фиксированной длины из <stdint.h>, такие как int16_t. Если переменной нужно хранить значения, равные или превышающие 2^31 (2GiB), используйте 64-битный тип int64_t. При оценке размера не забудьте, что в int должен укладываться не только результат, но и промежуточные значения при вычислениях. И, если сомневаетесь, используйте тип подлиннее.
Определение
C++ не уточняет размер целочисленных типов, таких как int. Обычно считается, что short содержит 16 битов, int — 32, long — 32 и long long содержит 64 бита.
За
Унификация в коде.
Против
Размеры целочисленных типов в C++ могут изменяться в зависимости от компилятора и архитектуры.
Вердикт
В <cstdint> определяются различные типы: int16_t, uint32_t, int64_t и т.д. Если требуются типы фиксированного размера, то не используйте short, unsigned long long и им подобные. Из целочисленных типов языка C можно использовать только int. Также, в соответствующих случаях, используйте size_t и ptrdiff_t.
Тип int используется очень часто, особенно для небольших значений, например как счётчики в циклах. Можете считать, что int содержит минимум 32 бита (но не больше). Если требуется 64 битный целочисленный тип, то используйте int64_t или uint64_t.
Для типа который может хранить «большие значения» используйте int64_t.
Старайтесь не использовать беззнаковые числа (например, uint32_t). Допустимое применение беззнаковых чисел это использование битовых представлений или использование переполнения (по модулю 2^N) в расчётах. Отметим, что также не рекомендуется использовать беззнаковый тип чтобы указать на отсутствие отрицательных значений: в этом случае используйте assert-ы.
Если код возвращает размер контейнера, то убедитесь, что его тип (размера) является достаточным для любого возможного использования. И если сомневаетесь, используйте тип подлиннее.
Будьте внимательны при конвертировании целочисленных типов. Может появится неопределённое поведение (UB), ведущее к багам безопасности и другим проблемам.
Беззнаковые целые числа
Беззнаковые целые числа отлично подходят для работы с битовыми полями и модульной арифметики. Так сложилось, что стандарт C++ использует беззнаковые числа и для возврата размера контейнеров (хотя многие члены организации по стандартизации и считают это ошибкой; в любом случае, сейчас это уже не изменить). Ситуация, что беззнаковая арифметика по поведению является модульной (заворачивание значений при переполнении) и отличается от обычной (знаковой), не позволяет компилятору диагностировать большое количество ошибок. Фактически, такое поведение затрудняет оптимизацию.
С другой стороны, совместное использование беззнаковых и знаковых целых чисел создаёт ещё больше проблем. Лучшее решение: старайтесь использовать итераторы вместо указателей и явных размеров; не мешайте беззнаковые числа вместе со знаковыми; избегайте беззнаковых чисел (кроме работы с битовыми полями и для модульной арифметики); не используйте беззнаковые числа только чтобы показать, что переменная неотрицательная.
Совместимость с 64-бит
Написанный код должен быть совместим как с 64-битной, так и с 32-битной архитектурой. Особое внимание обращайте на печать в консоль, операции сравнения и выравнивание структур.
-
Форматные символы printf() для некоторых целочисленных типов основываются на макроопределениях (например, PRI из <cinttypes>). И такой подход является непрактичным, нежелательным и т.д. Поэтому очень желательно не использовать функцию printf (и подобные) в своём коде, или даже переписать существующий код. Вместо неё можно использовать библиотеки, поддерживающие безопасное форматирование числовых значений, такие как StrCat
или Substitute
для простых преобразований, или std::ostream
.К сожалению, макросы PRI являются единственным переносимым способом указать формат для типов данных с задаваемым размером (int64_t, uint64_t, int32_t, uint32_t и т.д.). По возможности не передавайте аргументы таких типов в функции, основанные на printf. Исключение составляют типы, для которых есть свой выделенный модификатор длины, например size_t (z), ptrdiff_t (t) и maxint_t (j).
- Помните, что sizeof(void*) != sizeof(int). Используйте intptr_t в случае, если требуется целочисленный тип размером, равным размеру указателя.
- Будьте аккуратны с выравниванием структур, особенно тех что записываются на диск. Обычно классы и структуры, в которых есть член типа int64_t или uint64_t, по умолчанию выравниваются на границу 8 байт в 64-битных системах. Если в коде есть подобные структуры, они сохраняются на диске и используются 32-битным и 64-битным кодом, то обязательно проверьте, что структуры упаковываются одинаково на обеих архитектурах. Большинство компиляторов позволяют задать выравнивание структур. В gcc можно использовать __attribute__((packed)). В MSVC — #pragma pack() и __declspec(align()).
-
Используйте инициализацию в фигурных скобках если требуется создать 64-битную константу. Например:
int64_t my_value{0x123456789}; uint64_t my_mask{3ULL << 48};
Макросы препроцессора
Избегайте определения макросов, особенно в заголовочных файлах. Вместо этого используйте встраиваемые функции, перечисления или переменные-константы. Если используете макросы, то в имени используйте префикс — название проекта. Не используйте макросы, чтобы переопределить или дополнить C++ API.
Использование макросов подразумевает, что программист видит один код, а компилятор — другой. Это может вызвать неожиданные последствия, особенно если макросы глобальные.
Ситуация может усугубиться, когда макросы используются для переопределения С++ или другого публичного API. При любых ошибках в использовании API потребуется разбираться в логике макросов; увеличивается время разбора кода инструментами рефакторинга или анализаторами. Как результат, использование макросов в таких случаях запрещено. Например, откажитесь от подобного кода:
class WOMBAT_TYPE(Foo) {
// ...
public:
EXPAND_PUBLIC_WOMBAT_API(Foo)
EXPAND_WOMBAT_COMPARISONS(Foo, ==, <)
};
К счастью, в C++ зависимость от макросов поменьше, чем в C. Вместо макросов для высокопроизводительного кода можно использовать встраиваемые функции. Для хранения констант есть const переменные. Чтобы для удобства «укоротить» длинное имя переменной используйте ссылки. Вместо применения макросов для условной компиляции кода используйте… лучше не используйте условную компиляцию (конечно же это не касается защиты от повторного включения заголовочных файлов через #define). Тем более условная компиляция затрудняет тестирование кода.
С другой стороны, есть приёмы кодирования, которые делаются только через макросы. Обычно это можно увидеть в низко-уровневых библиотеках. Также есть приёмы (преобразование в строку, объединение строк и т.д.), которые нельзя сделать средствами самого языка напрямую. В любом случае, перед использованием макросов попробуйте найти способ реализации без макросов. Если же необходимо использовать макросы для определения интерфейса то предварительно обязательно проконсультируйтесь с руководством.
Следующие правила позволят избежать ряда проблем с макросами. По возможности следуйте им:
- Не определяйте макросы в заголовочных (.h) файлах.
- Определяйте (#define) макросы по возможности ближе к месту первого использования. И когда макросы уже не используются, то делайте #undef.
- Не делайте #undef существующих макросов с последующим их переопределением своей версией. Вместо этого лучше придумайте для своих макросов уникальное имя и используйте его.
- Постарайтесь не использовать макросы, которые раскрываются в большие и неустойчивые конструкции C++. По крайней мере, документируйте такое поведение.
- Старайтесь не использовать ## для генерации имени функции/класса/переменной.
Настоятельно не рекомендуется экспортировать макросы из заголовочных файлов (т.е. определять макрос и не делать #undef его в конце заголовочного файла). Если макрос экспортируется из заголовочного файла, то он должен иметь глобальное уникальное имя. Как вариант, добавьте префикс с именем пространства имён проекта (заглавными буквами).
0 и nullptr/NULL
Используйте nullptr для указателей и ‘