Начинаю осваивать C, появляются вопросы...

Модератор: Модераторы разделов

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

Bizdelnick писал:
27.08.2018 15:32
А как кошерно перевести statement — не знаю
Просмотрел навскидку четыре книги по Си.
Ориентир: языковая конструкция, завершающаяся точкой с запятой.
В книге Стивена Кочана именно эта конструкция называется statement.
В русскоязычном варианте используется термин "утверждение".

В переводных книгах других авторов (Дейтейл, Прата) эта же конструкция обозначается термином "оператор".
В книге Подбельского также используется термин "оператор".

Лично мне термин "утверждение" понравился больше.
Во-первых, сразу понятно, о чем идет речь (в отличие от термина "оператор" - у Подбельского "оператором" называется куча всякой всячины, в том числе "точка с запятой"), во-вторых, мне это как-то ближе с точки зрения языковых построений: текст на естественном языке состоит из "предложений", программа на ЯП состоит из "утверждений". В свою очередь "утверждение" может быть "истинным" или "ложным", что вполне сочетается с возможностями языка Си.

А по гугл-словарю перевод слова statement первым вариантом выдает "заявление", вторым "утверждение", третьим "оператор". То есть "утверждение" вполне имеет право на существование.
Последний раз редактировалось Hephaestus 28.08.2018 07:01, всего редактировалось 1 раз.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

QWERTYASDF писала:
26.08.2018 16:28
Если к Си применима классификация операторов на "простые" и "составные", то к какому из этих типов относятся операторы условий (if) или циклов (for)? Во многом интуитивно склоняюсь, что - к простым. Так ли это?
Если рассуждать в этих категориях, то как раз "if" и "for" правильнее отнести к "составным" операторам.
"Простой" оператор (например, бинарный) обозначается каким-либо символом и может быть записан в виде одной инструкции вроде "операнд1 <символ оператора> операнд2".
Конструкции "if" и "for" в эту категорию ну никак не запихнуть - они по определению состоят из нескольких инструкций, следовательно, являются "составными".
Вероятно, можно привести частные случаи вроде "пустого цикла", когда "составной" оператор не состоит "из нескольких инструкций" и выглядит как "простой", но это именно частные случаи.
QWERTYASDF писала:
26.08.2018 16:28
Если в Си, и других языках определенного типа, операторы можно сравнить с предложениями естественного языка, и соответственно выделить в них главный член - т.е. глагол в данном случае - то как формально называется в контексте Си (или иного ЯП) такой главный член?
Если отвечать на Ваш вопрос прямо, то наиболее близким будет термин "операция" или "действие". Но это очень приблизительно.
А вот если использовать термин "утверждение" из моего предыдущего поста, или, скажем, термин "инструкция", то вопрос снимается сам собой, так как выделять главный член уже не потребуется.
Если Вы изучали информатику в школе, то возможно, Вы помните, что там вводится понятие "исполнитель" или "робот". А программа - это набор точных и однозначных инструкций для этого "исполнителя". Можно назвать их "команды". Так вот, команды формулируются строго определенным образом. Поэтому соотносить их с предложениями естественного языка, а тем более выделять, скажем, "подлежащее" и "сказуемое", конечно можно, но довольно бессмысленно.
QWERTYASDF писала:
26.08.2018 16:28
Однако для меня здесь есть некая путаница. "Оператором" называют, как само printf, так и всю строку, включая "второстепенные члены предложения". Есть ли в Си специальное название, определяющая сам по себе "глагол" т.е. "printf"?
Это особенности перевода. Всю строку можно назвать термином "инструкция" или "утверждение" (statement), а конкретный "глагол" - "оператор" или "имя функции".
В русскоязычных переводах и то, и другое называют "оператор", что и создает путаницу. См. мой предыдущий пост.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Hephaestus писал:
27.08.2018 23:31
В свою очередь "утверждение" может быть "истинным" или "ложным", что вполне сочетается с возможностями языка Си.
Это заблуждение. В языке Си утверждение (statement) не может быть ни истинным, ни ложным. Истинным или ложным может быть результат той или иной операции (operator), включая построенные из них более сложные выражения.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20792
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Bizdelnick »

bormant писал(а):
28.08.2018 11:43
Истинным или ложным может быть результат той или иной операции (operator), включая построенные из них более сложные выражения.
Да и это упрощение. Результат операции не ограничивается "истиной" или "ложью", тем более что булев тип данных появился только в C99, если не ошибаюсь.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

bormant
Bizdelnick
Я немного другое имел в виду.
Я имел в виду, что утверждение в смысле мат. логики может быть истинным или ложным.
А утверждение в смысле statement может давать результат, который можно интерпретировать, как "истина" или "ложь", в зависимости от ситуации, конечно.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
QWERTYASDF
Сообщения: 989
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение QWERTYASDF »

Спасибо. Дальше эти вопросы обсуждать не планирую т.к. крохотный островок неких представлений уже появился, от него можно отталкиваться. Однако, что касается вопроса за "глагол" - то для себя я пока использую наиболее подходящее сейчас мне определение - "ключевое слово". Это мне встретилось где-то в каких-то статьях или учебниках.

Пока все получается в рамках учебных упражнений, но больше методом тыка и где-то даже интуиции. Если задумываться над каждым не очень понятным моментом - все встанет. В принципе, я уже имею некоторое знакомство с ЯП на примере создания простых sh-скриптов. Да и книгу "программирование для чайников" когда-то очень давно удалось пройти вроде до середины )) Пока вижу, что суть одна - следование/ветвление/циклы. Даже ключевые слова операторов во многом совпадают.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

QWERTYASDF писала:
28.08.2018 16:20
Однако, что касается вопроса за "глагол" - то для себя я пока использую наиболее подходящее сейчас мне определение - "ключевое слово".
"Ключевое слово" - это более широкое понятие, чем просто "глагол". Например, в условном операторе слова "if", "then", "else" являются ключевыми, т.е. специальными, зарезервированными. Но ни одно из них не является "глаголом".
Возможно, Вам будет проще, если Вы примете для себя упомянутую мной выше концепцию "исполнителя".
Её ведь не просто так вводят в начальном курсе информатики.
Так вот, если считать, что у нас есть "исполнитель", которому мы отдаем "команды", получается следующее. "Команда" - призыв к действию для "исполнителя".
Следовательно, "главный член", "глагол" - это само действие (операция), остальное - операнды - то, над чем производится действие. Ключевые слова действительно могут помочь сориентироваться.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Hephaestus писал:
28.08.2018 15:03
А утверждение в смысле statement может давать результат, который можно интерпретировать, как "истина" или "ложь"
Statement в Си не может давать никакого результата (но может вызвать исключение), только operator или их комбинация (expression) может давать результат.
QWERTYASDF писала:
28.08.2018 16:20
использую наиболее подходящее сейчас мне определение - "ключевое слово"
Лучше сразу разбавить понятийный аппарат понятием "идентификатор". Часть идентификаторов являются ключевыми словами (keyword) их нельзя переопределить (if, else, for, while и т.д.). Часть поименована в стандарте как часть стандартной библиотеки времени исполнения (runtime library). Другие вы вводите самостоятельно при написании программы.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20792
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Bizdelnick »

bormant писал(а):
28.08.2018 22:24
Statement в Си не может давать никакого результата (но может вызвать исключение)
В C появились исключения? Я что-то пропустил? Или сейчас снова окажется, что речь не об exception, а о чём-то другом?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
QWERTYASDF
Сообщения: 989
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Начинаю осваивать C, появляются вопросы...

Сообщение QWERTYASDF »

Забавно : ) Задаешь вопрос, начинаются ответы: "какие странные вопросы...", "зачем спрашиваете, чем хотите заниматься то?", "не страдайте урундой". А потом начинается бурная дискуссия. Получается, что вопрос то интересен даже господам практикам.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

bormant писал(а):
28.08.2018 22:24
Statement в Си не может давать никакого результата (но может вызвать исключение), только operator или их комбинация (expression) может давать результат.
Я всё-таки допускаю, что statement может давать результат, ибо operator - это частный случай statement.
Вы можете дать конкретный пример инструкции на языке Си, которая является operator, но при этом не является statement?

И, да, насчет исключений. В pure C нет такой конструкции.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

QWERTYASDF писала:
28.08.2018 22:56
Забавно : ) Задаешь вопрос, начинаются ответы: "какие странные вопросы...", "зачем спрашиваете, чем хотите заниматься то?", "не страдайте урундой".
Ну, лично я ничего такого не говорил. И прежде чем пускаться в рассуждения, я всё-таки попробовал дать конкретные ответы на Ваши вопросы.
А что касается рисков "утонуть в терминах" - посмотрите книгу Подбельского.
Автор первым делом вываливает на читателя кучу терминов, определений, таблицу ключевых слов (мне это напоминает таблицу неправильных глаголов в английском языке - такая же бестолковая), таблицу операторов с приоритетами, ещё что-то такое... место всему этому богатству в справочнике или в приложении, а не на первых страницах.
И когда дело доходит, наконец, до, собственно, конструкций языка и первых примеров программ, в голове уже имеется довольно густая каша из справочных (именно справочных) данных, которые на этом этапе применить просто некуда.
И лично у меня к этом моменту пропала всякая охота читать эту книгу.
А примеры всё равно начинаются с "Hello World", где не нужны ни ранги операторов, ни зарезервированные слова, ни куча терминов.
Ярчайший пример того, как не надо излагать материал.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: Начинаю осваивать C, появляются вопросы...

Сообщение yoshakar »

Вообще-то перевод нехудожественной литературы — это дело как раз не лингвистов-переводчиков (если они за это берутся, то, как правило, делают очень неправильно), а именно что специалистов по соответствующему предмету.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Vascom »

QWERTYASDF писала:
28.08.2018 22:56
Забавно : ) Задаешь вопрос, начинаются ответы: "какие странные вопросы...", "зачем спрашиваете, чем хотите заниматься то?", "не страдайте урундой". А потом начинается бурная дискуссия. Получается, что вопрос то интересен даже господам практикам.
Это чтобы удостовериться, что топикстартер понимает свой вопрос и ему нужен ответ именно на это.
Очень часто случается, что вопрошающим нужно совсем другое.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение serzh-z »

QWERTYASDF
Так дело не столько в содержании вопроса, а в его форме. С таким же успехом можно спросить "А правда, что камни любят ушами?" и после некоторого замешательства к теме подключатся и археологи, и программисты, и психологи. Возникнут вопросы - что считать камнями и чем их поливать...
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Bizdelnick писал:
28.08.2018 22:35
В C появились исключения? Я что-то пропустил? Или сейчас снова окажется, что речь не об exception, а о чём-то другом?
Hephaestus писал:
28.08.2018 23:55
И, да, насчет исключений. В pure C нет такой конструкции.
Сразу обоим.
В pure C нет обработки исключений. Но неявно вызвать исключительную ситуацию, влекущую abnormal termination, возможно. В этом случае statement не возвращает управление в точку исполнения следом за ним (а обсуждали возможность вернуть значение). Безусловно, есть возможность явного вызова как нормального завершения так и ненормального, а также передачи управления куда-то еще, но в этих случаях такое поведение является единственным ожидаемым следствием, потому в контексте "может ли statement вернуть значение" абсолютно неинтересно.

Некоторые реализации C имеют расширения, позволяющие выполнять структурную обработку исключений, но мы их тут тоже не обсуждаем.
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Hephaestus писал:
28.08.2018 23:55
Вы можете дать конкретный пример инструкции на языке Си, которая является operator, но при этом не является statement?
Могу дать statement без operator. Нет operator, нет возврата значения (goto forest;), есть operator -- есть значение (i = j = 0;), но statement его не получает и никуда не возвращает.

PS. Кстати, согласно "6.8 Statements and blocks", declaration не является statement, поэтому могу: int i=1+1;
Правда здесь "=" не operator, да и насчет "+" есть сомнения. Никогда до такой степени не загонялся на терминологии ;-)
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение serzh-z »

bormant писал(а):
29.08.2018 10:09
Но неявно вызвать исключительную ситуацию, влекущую abnormal termination
Это вы про SIGABRT или SIGFPE, которые имеют такое же отношение к C, как и к любому приложению на любом другом языке?
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

serzh-z писал:
29.08.2018 10:39
Это вы про SIGABRT или SIGFPE, которые имеют такое же отношение к C, как и к любому приложению на любом другом языке?
Можно и их учесть в этом перечне ;-)
А вот про отношение к Си -- это вы поторопились. Рекомендую к (пере)прочтению "7.14 Signal handling <signal.h>" -- часть языка, однако, если мы согласны описание стандартной библиотеки считать частью языка (а куда мы денемся ;-) )...
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

bormant писал(а):
29.08.2018 10:18
Могу дать statement без operator. Нет operator, нет возврата значения (goto forest;), есть operator -- есть значение (i = j = 0;), но statement его не получает и никуда не возвращает.
Я не сказал, что statement возвращает значение. Я сказал "может давать результат". В частных случаях.
Например

Код: Выделить всё

if(mySuperFunction(a,b))
printf("OK");
Здесь значение возвращает функция mySuperFunction, однако инструкция вызова функции - вполне себе statement.
Можно ли считать, что в условии проверяется результат statement? Вполне можно. Но, подчеркиваю ещё раз: это частные случаи.
Если Вы не согласны, тогда давайте точнее разбираться, что есть statement. Допускаю, что у меня неверное понимание этого термина.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Hephaestus писал:
29.08.2018 10:56
однако инструкция вызова функции - вполне себе statement.
Можно ли считать, что в условии проверяется результат statement? Вполне можно
Садитесь, два ;)
statement -- if (...) ... ;
"mySuperFunction" -- идентификатор, function designator, его значение -- адрес точки входа в функцию, "()" -- операция (operator) вызова функции, "a,b" -- actual argument; все вместе "mySuperFunction(a,b)" -- function call expression.
"printf("OK")" -- всё так же, поскольку printf() возвращает int, а в точке вызова он (возвращаемое значение) не используется, выражение вызова эквивалентно: (void)printf("OK"), и вот здесь expression statement выглядит именно так, с завершающим ";": "(void)printf("OK");" (см. 6.8.3. example 1):
EXAMPLE 1 If a function call is evaluated as an expression statement for its side effects only, the discarding of its value may
be made explicit by converting the expression to a void expression by means of a cast:

Код: Выделить всё

int p(int);
/* ... */
(void)p(0);
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение serzh-z »

bormant писал(а):
29.08.2018 10:47
Можно и их учесть
Что значит можно и учесть? "Abnormal termination" - это и есть перехват SIGABRT с дальнейшим умиранием.

Это вовсе не тот механизм исключений, о которых, думаю, шла речь выше. Несерьёзно это - приписывать языку фичи ОС, пусть даже и развивавшиеся одновременно с идеями из C. А то так можно дойти и до того, что в C есть, например, каналы. )
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

serzh-z писал:
29.08.2018 11:26
Это вовсе не тот механизм исключений, о которых, думаю, шла речь выше.
bormant писал(а):
28.08.2018 22:24
Statement в Си не может давать никакого результата (но может вызвать исключение), только operator или их комбинация (expression) может давать результат.
Здесь не было речи о механизме исключений, речь только о том, что statement не возвращает результата, а может и вовсе не завершиться в обычном смысле, то есть и до получения результата дело может не дойти вовсе. Только и всего. Сформулировано коряво, не спорю, но как получилось, так получилось.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

bormant писал(а):
29.08.2018 11:09
statement -- if (...) ... ;
"mySuperFunction" -- идентификатор, function designator, его значение -- адрес точки входа в функцию, "()" -- операция (operator) вызова функции, "a,b" -- actual argument; все вместе "mySuperFunction(a,b)" -- function call expression.
"printf("OK")" -- всё так же, поскольку printf() возвращает int, а в точке вызова он (возвращаемое значение) не используется, выражение вызова эквивалентно: (void)printf("OK"), и вот здесь expression statement выглядит именно так, с завершающим ";": "(void)printf("OK");" (см. 6.8.3. example 1):
Не вижу противоречия со сказанным мной выше.
https://en.cppreference.com/w/c/language/statements писал(а):

Код: Выделить всё

int main(void)
{ // start of a compound statement
    int n = 1; // declaration (not a statement)
    n = n+1; // expression statement
    printf("n = %d\n", n); // expression statement
    return 0; // return statement
} // end of compound statement, end of function body
There are five types of statements:

1) compound statements
2) expression statements
3) selection statements
4) iteration statements
5) jump statements
Как видим, есть несколько типов statement и вызов функции - один из возможных вариантов.
И если вызов функции есть statement, то результат этого вызова есть результат statement. Почему нет? Используется этот результат или не используется - это вопрос отдельный. Суть от этого не меняется.
Другое дело, что statement, бывают разные - это да. Ну так я сразу об этом сказал - частные случаи.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: Начинаю осваивать C, появляются вопросы...

Сообщение /dev/random »

Hephaestus писал:
29.08.2018 12:18
Как видим, есть несколько типов statement и вызов функции - один из возможных вариантов.
И если вызов функции есть statement, то результат этого вызова есть результат statement. Почему нет? Используется этот результат или не используется - это вопрос отдельный. Суть от этого не меняется.
Другое дело, что statement, бывают разные - это да. Ну так я сразу об этом сказал - частные случаи.
Переулок, в принципе, может состоять из одного дома. Но это не значит, что дом может быть переулком. Так же и здесь. Statement может состоять из одного вызова функции, но это не значит, что вызов функции может быть statement'ом.
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Hephaestus писал:
29.08.2018 12:18
И если вызов функции есть statement, то результат этого вызова есть результат statement. Почему нет?
Потому что нет. Нет такой возможности в стандарте Си.
Результат операции (operator) присваивания есть. Результат вызова функции есть. Побочные эффекты от вызова функции тоже есть (собственно вывод). А результата ни одного из statement нет.
Ну вот такой он язык Си, что тут поделаешь...

PS. Вдруг вот так будет понятнее:

Код: Выделить всё

int main(void)
{ // start of a compound statement
    int n = 1; // declaration (not a statement)
    (void)(n = n+1); // expression statement
    (void)printf("n = %d\n", n); // expression statement
    return 0; // return statement
} // end of compound statement, end of function body
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

/dev/random писал:
29.08.2018 12:30
Переулок, в принципе, может состоять из одного дома.
Не может. Переулок не состоит из домов. Улица/переулок - чисто условная вещь. Условная единица в иерархии административного/муниципального деления и не более. Другими словами, на улице может вообще не быть домов, но она улицей от этого быть не перестанет до тех пор, пока данный участок не будет классифицирован как-то иначе.
/dev/random писал:
29.08.2018 12:30
Statement может состоять из одного вызова функции, но это не значит, что вызов функции может быть statement'ом.
Да я в общем-то не возражаю.
Я могу только ещё раз процитировать кусок кода

Код: Выделить всё

int main(void)
{ // start of a compound statement
    int n = 1; // declaration (not a statement)
    n = n+1; // expression statement
    printf("n = %d\n", n); // expression statement
    return 0; // return statement
} // end of compound statement, end of function body
в котором совершенно четко указано, где "statement", а где "not a statement".
Исходя из этого, рискну предположить, что если вызов функции не может быть statement, его бы, наверно, и обозначили как "not a statement". Но этого не сделано, следовательно вызов функции - это всё-таки statement.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Начинаю осваивать C, появляются вопросы...

Сообщение Hephaestus »

bormant писал(а):
29.08.2018 12:58
Потому что нет. Нет такой возможности в стандарте Си.
Ну, в таком случае, как я уже сказал, нужна четкая и однозначная формулировка что есть statement.
C чем его можно отождествлять, а с чем нельзя.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
Аватара пользователя
bormant
Сообщения: 1354

Re: Начинаю осваивать C, появляются вопросы...

Сообщение bormant »

Hephaestus писал:
29.08.2018 13:24
следовательно вызов функции - это всё-таки statement
Вызов функции -- это "function call expression", expression statement из одного вызова функции немного отличается ;-) той самой ";".
Возьмем такое function call expression: "printf("Ok")":

Код: Выделить всё

  if ( printf("Ok") ) ;
  printf("Ok");
Здесь одно и тоже выражение вызова функции использовано дважды -- в выражении (expression) внутри if (...) и в expression statement.
Вы же видите разницу, да?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: Начинаю осваивать C, появляются вопросы...

Сообщение /dev/random »

Hephaestus писал:
29.08.2018 13:24
Другими словами, на улице может вообще не быть домов, но она улицей от этого быть не перестанет до тех пор, пока данный участок не будет классифицирован как-то иначе.
Всё правильно. И statement тоже может быть пустым - ";".
Hephaestus писал:
29.08.2018 13:24
Да я в общем-то не возражаю.
Я могу только ещё раз процитировать кусок кода

Код: Выделить всё

int main(void)
{ // start of a compound statement
    int n = 1; // declaration (not a statement)
    n = n+1; // expression statement
    printf("n = %d\n", n); // expression statement
    return 0; // return statement
} // end of compound statement, end of function body
в котором совершенно четко указано, где "statement", а где "not a statement".
Исходя из этого, рискну предположить, что если вызов функции не может быть statement, его бы, наверно, и обозначили как "not a statement". Но этого не сделано, следовательно вызов функции - это всё-таки statement.
Это statement: "foo(bar);". Это - нет: "foo(bar)". Отличие в точке с запятой.

Точного определения термину statement нет. Только приблизительные. Любая попытка сказать, что человек - это двуногое без перьев, заставит Диогена выставить на всеобщее обозрение ощипанную курицу. Но это не значит, что каждый волен сам решать, что называть statement. В качестве приблизительного определения можете взять следующее: "та фигня, которая в C отделяется точкой с запятой, а в Питоне занимает отдельную строку, или их синтаксически объединённая группа". Разумеется, у этого определения есть исключения, и приведённый вами кусок кода как раз и показывает, что является исключениями, а что - нет. Он предполагает, что приблизительное определение у вас в голове уже есть.
Спасибо сказали:
Ответить