| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Оператор "точка с запятой" - что это? |
| Автор: zim22 24.6.2009, 19:26 | ||||
| Читаю Страуструпа. Нашёл кусок грамматики С++. Заинтересовал оператор if. Он принимает condition. condition является expression. но этот код у меня не компилируется:
значит ли это, что пустой оператор (;) не является expression? чем он тогда является? Statement Syntax:
|
| Автор: azesmcar 24.6.2009, 19:43 | ||
Синтаксическая ошибка Такого оператора нет. Это разделитель. Я вижу аналогию с for. Насчет цикла for, об использовании semicolon явно сказано в стандарте, его ставят после for-init-statement и после condition. Все параметры - помечены как опциональные, потому он может принимать пустой init-statement, пустой condition и пустой expression. А вот с if такое не позволено. Добавлено через 4 минуты и 2 секунды Вот, нашел список всех операторов C++ http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B |
| Автор: Cheloveck 24.6.2009, 20:30 | ||
Но не любой expression является condition. condition (условие тобиш по-русски) - это expression (выражение тобиш), обратимое в целочисленное значение, коими являются bool и int. А ; вряд ли обратится когда в нечто подобное. ; - это оператор. С таким же успехом можно написать
|
| Автор: azesmcar 24.6.2009, 20:46 | ||
if( + ) не будет откомпилирован но совершенно другой причине. + это бинарный оператор и он принимает два параметра. Но если ему передать аргументы - то все будет отлично работать.
|
| Автор: kemiisto 24.6.2009, 21:08 | ||
Надеюсь, Вы эдак прикалыватесь? А иначе... Строго говоря, нет. Это просто некий символ, который ставится в конце инструкций (statement). А разделителем он таки не является.
Последнея точка с запятой в этом примере какбэ говорит нам, я - не разделитель! Потому что, нечего там разделять. P.S. А что у ++ нет EBNF нотаций в стандарте? |
| Автор: zim22 24.6.2009, 21:25 |
| вопрос остаётся открытым. т.к. имеется аж 4 варианта догадок: |
| Автор: kemiisto 24.6.2009, 21:25 | ||
Ну, почти угадал. http://www.externsoft.ch/download/cpp-iso.html#expression_statement. Добавлено @ 21:28 zim22, а в чём проблема? ; - это терминальный символ, который ставится в конце каждого expression внутри expression statement и кое-где ещё. |
| Автор: zim22 24.6.2009, 21:35 | ||
теперь я понял! конец выражения мы указываем с помощью ; если же мы просто пишем ; без expression перед ней - то это означает, что expression у нас всё равно есть, но оно пустое. так? |
| Автор: kemiisto 24.6.2009, 21:39 |
Да. Именно по этому в цикле с предусловием к Вас "прокатило". С пустым expression'ом по сути. Добавлено через 2 минуты и 51 секунду А с if не "канает" ибо там нужен condition, а он есть:
|
| Автор: triclosan 24.6.2009, 21:44 |
Бывает и унарным ;) |
| Автор: azesmcar 24.6.2009, 21:53 | ||
Это не оператор! Посмотрите, список операторов прилагается чуть ли не в каждой книге, в стандарте. И я ссылку на вики прислал. Да Можно назвать это punctuator -ом. Рассмотрим вот это
почему этот код не станет работать? Компилятор не будет знать что тут 2 expression-а, ему нужно это указать, их надо разделить. В данном контексте ; работает как разделитель. Его смысл в том чтобы разделить выражения и дать компилятору понять что выражений там 2. Это совсем другая тема для разговора и к данному вопросу она мало относится. Мы говорим о разных операторах. Это только пример, так что не думаю что стоит так глубоко вдаваться в это. |
| Автор: Cheloveck 24.6.2009, 22:12 | ||
Ну, можно назвать оператором, который не принимает ниодного аргумента и ничего не возвращает. Насчёт statement -http://www.google.com/dictionary?aq=f&langpair=en|ru&q=statement&hl=ru. А на инструкцию это слабо катит, ибо есть в асме такая инструкция nop, которая ничего не делает ( скорее делает ничего - "This is a do nothing instruction" в оригинальной справке ). А вместо ; ничего не подставляется. |
| Автор: azesmcar 24.6.2009, 22:24 | ||||
странный оператор Добавлено через 3 минуты и 32 секунды
nop используется для усложнения дизассемблирования программы. В C++ я сильно сомневаюсь что он что-то даст. Следовательно переводить пустой expression в nop не имеет смысла. |
| Автор: mes 24.6.2009, 22:30 |
это вторичное назначение, первичное - выравнивание. |
| Автор: UnrealMan 24.6.2009, 22:32 | ||
Этот форум становится всё ржачнее и ржачнее ; - это пунктуатор (punctuator), который может являться составной частью различных нетерминалов. Он не является концом выражения, он является завершающим звеном в expression-statement. Если в expression-statement отсутствует expression, то это не значит, что expression присутствует, но оно пустое Master C++ не знает про унарный + ? Как же так, как же так? Дай-ка угадаю, с какой попытки ты прошёл тот тест, что у тебя в подписи? С двухсотой? |
| Автор: azesmcar 24.6.2009, 22:35 | ||
Браво! Ты как всегда читаешь и понимаешь написанное так, как тебе хочется. Это ты как догадался что я про него не знаю? Ничего что это был пример и не связан был с темой? Придраться к каждому слову можно, вот только это не всегда уместно. Я кстати потом отредактировал, специально для тех кто может не так понять. |
| Автор: sdukshis 24.6.2009, 22:35 |
| Насколько я помню, то, например, в языке Pascal ; считается разделителем. А вот в C (и в C++) ; - это часть оператора. |
| Автор: azesmcar 24.6.2009, 22:36 |
| Если ты не заметил я в первом посте прислал список операторов С++ и на первом месте там унарный оператор +. Я уже писал об этом. |
| Автор: Lazin 24.6.2009, 23:03 |
вот оказывается почему я в конце почти каждой строки ставлю ; |
| Автор: UnrealMan 24.6.2009, 23:08 | ||
Прошу прощения за неточность: правильнее было сказать "не знал на момент написания того, что я процитировал"
Действительно странно, как это ты сразу его не заметил? |
| Автор: azesmcar 24.6.2009, 23:24 | ||
Серьезно? Спасибо что сообщил. Теперь я знаю что я знал и чего не знал И кстати ты не единственный, есть множество людей которые знают С++ лучше меня (да и лучше тебя тоже). На этом надеюсь наше общение подошло к концу, так как удовольствия от него я не получаю. |