Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Оператор "точка с запятой" - что это?


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

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

if (;);

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

Statement Syntax:
Код

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


Автор: azesmcar 24.6.2009, 19:43
Цитата

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

Синтаксическая ошибка 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

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


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

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


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

 smile 

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

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

if (a + b) ...


Автор: zim22 24.6.2009, 20:53
Цитата(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 я ему подсунул ;
из этого делаю вывод, что моя теория подтвердилась.

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

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

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

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

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

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

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

Автор: zim22 24.6.2009, 21:25
вопрос остаётся открытым.
т.к. имеется аж 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 Найти цитируемый пост)
Это просто некий символ


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

Ну, почти угадал. http://www.externsoft.ch/download/cpp-iso.html#expression_statement.

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

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

Цитата

expression_statement    [ expression ] ';'

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

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

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

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

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

Бывает и унарным ;)

Автор: azesmcar 24.6.2009, 21:53
Цитата(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 Найти цитируемый пост)
Бывает и унарным ;) 

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

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

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

Насчёт 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
Цитата(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 не имеет смысла.

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

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

Автор: UnrealMan 24.6.2009, 22:32
Цитата(zim22 @  24.6.2009,  21:35 Найти цитируемый пост)
теперь я понял! конец выражения мы указываем с помощью ;
если же мы просто пишем ; без expression перед ней - то это означает, что expression у нас всё равно есть, но оно пустое.
так?

Этот форум становится всё ржачнее и ржачнее smile

; - это пунктуатор (punctuator), который может являться составной частью различных нетерминалов. Он не является концом выражения, он является завершающим звеном в expression-statement. Если в expression-statement отсутствует expression, то это не значит, что expression присутствует, но оно пустое smile Просто наличие expression в expression-statement является необязательным.

Цитата(azesmcar @  24.6.2009,  21:53 Найти цитируемый пост)
Серьезно? А тернарные бывают? 

Master C++ не знает про унарный + ? Как же так, как же так? Дай-ка угадаю, с какой попытки ты прошёл тот тест, что у тебя в подписи? С двухсотой? smile 

Автор: azesmcar 24.6.2009, 22:35
Цитата(UnrealMan @  24.6.2009,  22:32 Найти цитируемый пост)
Master C++ не знает про унарный + ? Как же так, как же так? Дай-ка угадаю, с какой попытки ты прошёл тот тест, что у тебя в подписи? С двухсотой? smile  

Браво! Ты как всегда читаешь и понимаешь написанное так, как тебе хочется. Это ты как догадался что я про него не знаю?
Ничего что это был пример и не связан был с темой? Придраться к каждому слову можно, вот только это не всегда уместно. Я кстати потом отредактировал, специально для тех кто может не так понять.

Автор: sdukshis 24.6.2009, 22:35
Насколько я помню, то, например, в языке Pascal ; считается разделителем.

А вот в C (и в C++) ; - это часть оператора.

Автор: azesmcar 24.6.2009, 22:36
Если ты не заметил я в первом посте прислал список операторов С++ и на первом месте там унарный оператор +.

Цитата(UnrealMan @  24.6.2009,  22:32 Найти цитируемый пост)
; - это пунктуатор (punctuator), 

Я уже писал об этом.

Цитата(azesmcar @  24.6.2009,  21:53 Найти цитируемый пост)
Можно назвать это punctuator -ом.


Автор: Lazin 24.6.2009, 23:03
Цитата(zim22 @  24.6.2009,  21:35 Найти цитируемый пост)
теперь я понял! конец выражения мы указываем с помощью ;

вот оказывается почему я в конце почти каждой строки ставлю ; smile 

Автор: UnrealMan 24.6.2009, 23:08
Цитата(azesmcar @  24.6.2009,  22:35 Найти цитируемый пост)
Это ты как догадался что я про него не знаю?

Прошу прощения за неточность: правильнее было сказать "не знал на момент написания того, что я процитировал" smile

Цитата(azesmcar @  24.6.2009,  22:36 Найти цитируемый пост)
Если ты не заметил я в первом посте прислал список операторов С++ и на первом месте там унарный оператор +.

Действительно странно, как это ты сразу его не заметил? smile Ну, ладно, хоть теперь заметил smile 

Автор: azesmcar 24.6.2009, 23:24
Цитата(UnrealMan @  24.6.2009,  23:08 Найти цитируемый пост)
Прошу прощения за неточность: правильнее было сказать "не знал на момент написания того, что я процитировал" smile

Серьезно? Спасибо что сообщил. Теперь я знаю что я знал и чего не знал smile Ну если у тебя только один способ понимания написанного (или твое эго не позволяет взглянуть на все с другой стороны) - о чем говорить? У меня совершенно нет желания тебе что-то доказывать smile Более того, мне абсолютно наплевать на мнение которое ты имеешь о моих познаниях в С++. Меня это меньше всего волнует. Меня не распирает от гордости что я почитал несколько книжек по С++, это всего лишь моя работа, а не смысл жизни. Если мысль о том что ты знаешь С++ больше меня - тешит твое эго - ради бога, считай так, и пусть даже так оно и есть. smile
И кстати ты не единственный, есть множество людей которые знают С++ лучше меня (да и лучше тебя тоже). На этом надеюсь наше общение подошло к концу, так как удовольствия от него я не получаю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)