![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Читаю Страуструпа.
Нашёл кусок грамматики С++. Заинтересовал оператор if. Он принимает condition. condition является expression. но этот код у меня не компилируется:
значит ли это, что пустой оператор (;) не является expression? чем он тогда является? Statement Syntax:
|
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Синтаксическая ошибка ![]() Такого оператора нет. Это разделитель. Я вижу аналогию с 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 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
Но не любой expression является condition. condition (условие тобиш по-русски) - это expression (выражение тобиш), обратимое в целочисленное значение, коими являются bool и int. А ; вряд ли обратится когда в нечто подобное. ; - это оператор. С таким же успехом можно написать
-------------------- ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
![]() if( + ) не будет откомпилирован но совершенно другой причине. + это бинарный оператор и он принимает два параметра. Но если ему передать аргументы - то все будет отлично работать.
|
|||
|
||||
zim22 |
|
||||||||||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
как увидите - это не разделитель.
с чего вы это взяли? посмотрите Стандарт. приложение A4 [gram.expr] expression - включает в себя гораздо больше, чем типы bool и int хотя наверно вы правы. я попробовал на место condition поставить expression c деструктором и компилятор выдал error:
а ниже в виде ещё одного warning ответ на мой вопрос:
хотя до этого я сам! ![]() объясняю почему: в той же таблице приведён пример и для других инструкций, в частности для while Statement Syntax:
теперь проверяем мою теорию:
компилится! исходя из грамматики while после condition обязательно должен принять statement. на место statement я ему подсунул ; из этого делаю вывод, что моя теория подтвердилась. Это сообщение отредактировал(а) zim22 - 24.6.2009, 21:28 |
||||||||||||
|
|||||||||||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Надеюсь, Вы эдак прикалыватесь? А иначе... ![]() Строго говоря, нет. Это просто некий символ, который ставится в конце инструкций (statement). А разделителем он таки не является.
Последнея точка с запятой в этом примере какбэ говорит нам, я - не разделитель! Потому что, нечего там разделять. P.S. А что у ++ нет EBNF нотаций в стандарте? ![]() -------------------- |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
вопрос остаётся открытым.
т.к. имеется аж 4 варианта догадок: |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Ну, почти угадал. Пруфлинк. Добавлено @ 21:28 zim22, а в чём проблема? ; - это терминальный символ, который ставится в конце каждого expression внутри expression statement и кое-где ещё. Это сообщение отредактировал(а) kemiisto - 24.6.2009, 21:29 -------------------- |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
теперь я понял! конец выражения мы указываем с помощью ; если же мы просто пишем ; без expression перед ней - то это означает, что expression у нас всё равно есть, но оно пустое. так? ![]() |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Да. Именно по этому в цикле с предусловием к Вас "прокатило". С пустым expression'ом по сути. Добавлено через 2 минуты и 51 секунду А с if не "канает" ибо там нужен condition, а он есть:
-------------------- |
|||
|
||||
triclosan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Это не оператор! Посмотрите, список операторов прилагается чуть ли не в каждой книге, в стандарте. И я ссылку на вики прислал. Да ![]() Можно назвать это punctuator -ом. Рассмотрим вот это
почему этот код не станет работать? Компилятор не будет знать что тут 2 expression-а, ему нужно это указать, их надо разделить. В данном контексте ; работает как разделитель. Его смысл в том чтобы разделить выражения и дать компилятору понять что выражений там 2. Это совсем другая тема для разговора и к данному вопросу она мало относится. Мы говорим о разных операторах. Это только пример, так что не думаю что стоит так глубоко вдаваться в это. Это сообщение отредактировал(а) azesmcar - 24.6.2009, 22:26 |
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 5 Всего: 32 |
Ну, можно назвать оператором, который не принимает ниодного аргумента и ничего не возвращает. Насчёт statement -см под 10 номером. А на инструкцию это слабо катит, ибо есть в асме такая инструкция nop, которая ничего не делает ( скорее делает ничего - "This is a do nothing instruction" в оригинальной справке ). А вместо ; ничего не подставляется. -------------------- ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
странный оператор ![]() Добавлено через 3 минуты и 32 секунды nop используется для усложнения дизассемблирования программы. В C++ я сильно сомневаюсь что он что-то даст. Следовательно переводить пустой expression в nop не имеет смысла. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
это вторичное назначение, первичное - выравнивание. |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Этот форум становится всё ржачнее и ржачнее ![]() ; - это пунктуатор (punctuator), который может являться составной частью различных нетерминалов. Он не является концом выражения, он является завершающим звеном в expression-statement. Если в expression-statement отсутствует expression, то это не значит, что expression присутствует, но оно пустое ![]() Master C++ не знает про унарный + ? Как же так, как же так? Дай-ка угадаю, с какой попытки ты прошёл тот тест, что у тебя в подписи? С двухсотой? ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Браво! Ты как всегда читаешь и понимаешь написанное так, как тебе хочется. Это ты как догадался что я про него не знаю? Ничего что это был пример и не связан был с темой? Придраться к каждому слову можно, вот только это не всегда уместно. Я кстати потом отредактировал, специально для тех кто может не так понять. Это сообщение отредактировал(а) azesmcar - 24.6.2009, 22:52 |
|||
|
||||
sdukshis |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 23.3.2009 Репутация: нет Всего: 1 |
Насколько я помню, то, например, в языке Pascal ; считается разделителем.
А вот в C (и в C++) ; - это часть оператора. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Если ты не заметил я в первом посте прислал список операторов С++ и на первом месте там унарный оператор +.
Я уже писал об этом. Это сообщение отредактировал(а) azesmcar - 24.6.2009, 22:37 |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
вот оказывается почему я в конце почти каждой строки ставлю ; ![]() |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 5 Всего: 32 |
Прошу прощения за неточность: правильнее было сказать "не знал на момент написания того, что я процитировал" ![]()
Действительно странно, как это ты сразу его не заметил? ![]() ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Серьезно? Спасибо что сообщил. Теперь я знаю что я знал и чего не знал ![]() ![]() ![]() И кстати ты не единственный, есть множество людей которые знают С++ лучше меня (да и лучше тебя тоже). На этом надеюсь наше общение подошло к концу, так как удовольствия от него я не получаю. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |