Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор "точка с запятой" - что это? выражение или инструкция? 
V
    Опции темы
zim22
Дата 24.6.2009, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Читаю Страуструпа.
Нашёл кусок грамматики С++. Заинтересовал оператор if.
Он принимает condition.
condition является expression.

но этот код у меня не компилируется:
Код

if (;);

значит ли это, что пустой оператор (;) не является expression?
чем он тогда является?

Statement Syntax:
Код

statement:
    if (condition) statement
...
condition:
    expression
    type-specifier declarator = expression




--------------------
PM MAIL   Вверх
azesmcar
Дата 24.6.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата

что это? выражение или инструкция?

Синтаксическая ошибка smile 

Цитата(zim22 @  24.6.2009,  19:26 Найти цитируемый пост)
что пустой оператор (;) 

Такого оператора нет. Это разделитель. Я вижу аналогию с 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
PM   Вверх
Cheloveck
Дата 24.6.2009, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата(zim22 @  24.6.2009,  20:26 Найти цитируемый пост)
Он принимает condition.
condition является expression.


Но не любой expression является condition. condition (условие тобиш по-русски) - это expression (выражение тобиш), обратимое в целочисленное значение, коими являются bool и int. А ; вряд ли обратится когда в нечто подобное. ; - это оператор. С таким же успехом можно написать
Код

if( + )
{
    //.......
}




--------------------
user posted image
PM Jabber   Вверх
azesmcar
Дата 24.6.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Cheloveck @  24.6.2009,  20:30 Найти цитируемый пост)
; - это оператор.

 smile 

Цитата(Cheloveck @  24.6.2009,  20:30 Найти цитируемый пост)
С таким же успехом можно написать

if( + ) не будет откомпилирован но совершенно другой причине. + это бинарный оператор и он принимает два параметра. Но если ему передать аргументы - то все будет отлично работать.
Код

if (a + b) ...


PM   Вверх
zim22
Дата 24.6.2009, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(azesmcar @  24.6.2009,  19:43 Найти цитируемый пост)
Такого оператора нет. Это разделитель

как увидите - это не разделитель.
Цитата(Cheloveck @  24.6.2009,  20:30 Найти цитируемый пост)
 обратимое в целочисленное значение, коими являются bool и int.

с чего вы это взяли? посмотрите Стандарт. приложение A4 [gram.expr]
expression - включает в себя гораздо больше, чем типы bool и int
Цитата(Cheloveck @  24.6.2009,  20:30 Найти цитируемый пост)
Но не любой expression является condition

хотя наверно вы правы. я попробовал на место condition поставить expression c деструктором и компилятор выдал error:
Цитата

error C2451: conditional expression of type 'void' is illegal
Expressions of type void cannot be converted to other types

Код

class C { } c;
if (c.~C());


а ниже в виде ещё одного warning ответ на мой вопрос:
Цитата

warning C4390: ';' : empty controlled statement found; is this the intent?


хотя до этого я сам! smile логическим путём пришёл к выводу, что ; - это инструкция (statement)
объясняю почему:
в той же таблице приведён пример и для других инструкций, в частности для while
Statement Syntax:
Цитата

statement: 
    while ( condition ) statement


теперь проверяем мою теорию:
Код

whle(true);

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

Это сообщение отредактировал(а) zim22 - 24.6.2009, 21:28


--------------------
PM MAIL   Вверх
kemiisto
Дата 24.6.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(zim22 @  24.6.2009,  18:53 Найти цитируемый пост)
из этого делаю вывод, что моя теория подтвердилась.

Надеюсь, Вы эдак прикалыватесь? А иначе... smile 

Цитата(azesmcar @  24.6.2009,  17:43 Найти цитируемый пост)
Такого оператора нет. Это разделитель. 

Строго говоря, нет. Это просто некий символ, который ставится в конце инструкций (statement). А разделителем он таки не является.
Код

main()
{
    cout << "Hello World!";
    return 0;
}

Последнея точка с запятой в этом примере какбэ говорит нам, я - не разделитель! Потому что, нечего там разделять.

P.S. А что у ++ нет EBNF нотаций в стандарте? smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
zim22
Дата 24.6.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



вопрос остаётся открытым.
т.к. имеется аж 4 варианта догадок:
Цитата(azesmcar @  24.6.2009,  19:43 Найти цитируемый пост)
Это разделитель.

Цитата(Cheloveck @  24.6.2009,  20:30 Найти цитируемый пост)
; - это оператор. 

Цитата(zim22 @  24.6.2009,  20:53 Найти цитируемый пост)
; - это инструкция (statement)

Цитата(kemiisto @  24.6.2009,  21:08 Найти цитируемый пост)
Это просто некий символ




--------------------
PM MAIL   Вверх
kemiisto
Дата 24.6.2009, 21:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(kemiisto @  24.6.2009,  19:08 Найти цитируемый пост)
Это просто некий символ, который ставится в конце инструкций (statement). 

Ну, почти угадал. Пруфлинк.

Добавлено @ 21:28
zim22, а в чём проблема? ; - это терминальный символ, который ставится в конце каждого expression внутри expression statement и кое-где ещё.

Это сообщение отредактировал(а) kemiisto - 24.6.2009, 21:29


--------------------
PM MAIL WWW GTalk Jabber   Вверх
zim22
Дата 24.6.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(kemiisto @  24.6.2009,  21:25 Найти цитируемый пост)
Ну, почти угадал.Пруфлинк. 

Цитата

expression_statement    [ expression ] ';'

теперь я понял! конец выражения мы указываем с помощью ;
если же мы просто пишем ; без expression перед ней - то это означает, что expression у нас всё равно есть, но оно пустое.
так? smile 


--------------------
PM MAIL   Вверх
kemiisto
Дата 24.6.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(zim22 @  24.6.2009,  19:35 Найти цитируемый пост)
так? 

Да. Именно по этому в цикле с предусловием к Вас "прокатило". С пустым expression'ом по сути.

Добавлено через 2 минуты и 51 секунду
А с if не "канает" ибо там нужен condition, а он есть:
  • expression
  • type_specifier_seq declarator '=' assignment_expression



--------------------
PM MAIL WWW GTalk Jabber   Вверх
triclosan
Дата 24.6.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Цитата(azesmcar @  24.6.2009,  20:46 Найти цитируемый пост)
+ это бинарный оператор и он принимает два параметра.

Бывает и унарным ;)
PM MAIL   Вверх
azesmcar
Дата 24.6.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(zim22 @  24.6.2009,  21:25 Найти цитируемый пост)
; - это оператор. 

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

Цитата(zim22 @  24.6.2009,  21:25 Найти цитируемый пост)
Это просто некий символ

Да smile некий символ. + тоже некий символ. Semicolon тоже некий символ, который служит для завершения expression-а. Можно сказать - для разделения expression-ов. Я не имел ввиду что это называется "разделитель", я смысл хотел передать. Я нигде не видел чтоб его как-то специально называли.

Можно назвать это punctuator -ом.
Рассмотрим вот это
Код

a = 1 b = 2

почему этот код не станет работать? Компилятор не будет знать что тут 2 expression-а, ему нужно это указать, их надо разделить. В данном контексте ; работает как разделитель. Его смысл в том чтобы разделить выражения и дать компилятору понять что выражений там 2.

Цитата(triclosan @  24.6.2009,  21:44 Найти цитируемый пост)
Бывает и унарным ;) 

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

Это сообщение отредактировал(а) azesmcar - 24.6.2009, 22:26
PM   Вверх
Cheloveck
Дата 24.6.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Цитата(azesmcar @  24.6.2009,  22:53 Найти цитируемый пост)
Это не оператор! Посмотрите, список операторов прилагается чуть ли не в каждой книге, в стандарте. И я ссылку на вики прислал.

Ну, можно назвать оператором, который не принимает ниодного аргумента и ничего не возвращает. 

Насчёт statement -см под 10 номером.
А на инструкцию это слабо катит, ибо есть в асме такая инструкция nop, которая ничего не делает ( скорее делает ничего - "This is a do nothing instruction" в оригинальной справке ). А вместо ; ничего не подставляется.


--------------------
user posted image
PM Jabber   Вверх
azesmcar
Дата 24.6.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Cheloveck @  24.6.2009,  22:12 Найти цитируемый пост)
Ну, можно назвать оператором, который не принимает ниодного аргумента и ничего не возвращает. 

странный оператор smile

Добавлено через 3 минуты и 32 секунды
Цитата(Cheloveck @  24.6.2009,  22:12 Найти цитируемый пост)
А на инструкцию это слабо катит, ибо есть в асме такая инструкция nop, которая ничего не делает ( скорее делает ничего - "This is a do nothing instruction" в оригинальной справке ). А вместо ; ничего не подставляется. 

nop используется для усложнения дизассемблирования программы. В C++ я сильно сомневаюсь что он что-то даст. Следовательно переводить пустой expression в nop не имеет смысла.
PM   Вверх
mes
Дата 24.6.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(azesmcar @  24.6.2009,  21:24 Найти цитируемый пост)
nop используется для усложнения дизассемблирования программы. 

это вторичное назначение, первичное - выравнивание.


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0931 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.