![]() |
Модераторы: 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 |
это вторичное назначение, первичное - выравнивание. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |