2016-08-26 6 views
-3

в C++ нет такой вещи, как оператор присваивания или оператор функции-вызова.Функция Call = выражение-statement ... даже функции типа void?

Назначение - это выражение; функция-вызов является выражением; это происходит прямо из Bjarne Stroustrup в его книге «Язык программирования C++».

Я знаю, что выражение вычисляет значение, которое меня интересует, применимо ли это к функциям void, поскольку они не возвращают значение.

Я хотел бы знать, если функции с возвращаемым типом void все еще считаются выражениями, и если да, то почему?

+2

Я пошел вперед и уменьшил несвязанную болтовню с вашего вопроса и немного структурировал. –

+1

Стандарт C++: * 1 Выражение представляет собой последовательность операторов и операндов, которая задает вычисление значения ** или **, который обозначает объект или функцию ** или **, которая генерирует побочные эффекты ** или ** который выполняет их комбинацию * (выделение мной), замечает, что выражение не обязательно вычисляет значение; однако некоторые выражения. –

+0

Возможный дубликат [Объяснение различия между оператором и выражением в C++] (http://stackoverflow.com/questions/27600153/explaining-the-difference-between-a-statement-and-an-expression-in- c) –

ответ

1

Да функции, возвращающие значение (объявленное как возвращаемое void), по-прежнему считаются выражениями, когда вы их вызываете. Это ограничивает их использование в других выражениях, хотя, например, такие вызовы не могут быть по обе стороны от назначения.

Что касается "почему"? Ну, вызов функции - вызов функции - вызов функции. Добавление специальных правил для функций, которые не возвращают значение, сделало бы язык намного сложнее. C++ уже имеют достаточно специальных правил и исключений.

1

C++14 standard:

§ 5 Выражения:

1 Выражение представляет собой последовательность операторов и операндов, что указывает вычисление. Выражение может результата в значении и может вызывать побочные эффекты

Таким образом, «основная» Цель/сферой выражения является указание вычисления, а не для вычисления значения. Некоторые вычисления могут привести к значению, а некоторые могут иметь побочные эффекты.

В дополнение к этому (или, в первую очередь, в первую очередь), «выражения» и «утверждения» используются при определении грамматики C и C++. Было бы синтаксически невозможно сделать функции, которые не возвращают значение, а не «выражение». И добавление этого различия на семантическом уровне было бы лишним излишним усложнением.

+0

Ничего себе. Справочное руководство у меня устарело и всего около 50 страниц. Этот PDF-файл похож на роман Стивена Кинга и, похоже, делает все возможное, чтобы излишне усложнять все, а не объяснять понятия ясным образом. –

+0

@j_burks, что pdf не является руководством. Это официальный стандарт C++. Он не предназначен для объяснения вещей новичкам. Это документ, который формальным, полным и недвусмысленным образом определяет, что такое C++. Это ссылка, на которой основаны компиляторы C++ и стандартные библиотеки. – bolov

0

Да, void вызов функции также является выражением. Определение в стандарте C++ говорит:

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

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

Кроме того, в MSDN C++ Language Reference:

постфикса-выражение следует оператор вызова функции,(), определяет вызов в функцию.

0

Функция Call = выражение-выражение ... даже функции типа void?

no. Но это потому, что вызов функции заключается в следующем:

do_stuff() 

и это в expression_opt. Это выражение, а не утверждение. Вы можете использовать это выражение в составных выражениях, но это не утверждение по логике языка.

Вы можете быстро преобразовать, что expression_opt к expression-statement, придав ему точку с запятой:

do_stuff(); 

теперь полное заявление.

Разница становится ясно, если вы думаете о чем-то вроде

if(good_thing() || do_stuff()) 
{ 
    .... 
} 

do_stuff() и good_thing() являются выражения, которые могут/будут оценены. Точки с запятой после () сломают это предложение if.

+0

Но если либо do_stuff(), либо good_thing() имеют возвращаемый тип void, который даже не будет скомпилирован. Мне показалось, что я понял, что это выражение-выражение, отделив его от других утверждений (например, объявления). Например, вы не можете назначить оператор объявления для lvalue, например int x = int y = 5; Но даже это не делает этого для объяснения.Вот почему я так запутался в выражениях, не оценивающих значение, потому что в течение многих лет это то, что я считал «выражением»: операция, которая возвращает одно значение. Теперь я должен «отучить» то, что я узнал. –