Интересный вопрос. После небольшого количества поиска "Частичное Функциональное Приложение не приправляет карри" , дал лучшее объяснение, которое я нашел. Я не могу сказать, что практичный различие особенно очевидно для меня, но тогда я не эксперт по FP...
Другая полезно выглядящая страница (который я признаюсь, что еще не полностью читал) "Приправляющее карри и Частичное Приложение с Закрытиями Java" .
действительно похоже, что это - широко перепутанная пара терминов, заметьте.
Оператор запятой - это бинарный оператор, который оценивает свой первый операнд и отбрасывает результат, это затем оценивает второй операнд и возвращает это значение.
Это также «точка последовательности» , что означает, что все побочные эффекты будут вычислены до выполнения следующей части кода.
Оператор запятая - странный зверь, пока вы не поймете его, и он не специфичен для , а
.
Выражение:
exp1, exp2
вычисляет exp1
затем вычисляет exp2
и возвращает exp2
.
Вы видите это часто, хотя можете и не осознавать этого:
for (i = j = 0; i < 100; i++, j += 2)
На самом деле вы не используете возвращаемое значение из «i ++, j + = 2»
, но тем не менее оно есть. Оператор запятой оценивает оба бита для изменения как i
, так и j
.
Вы можете довольно хорошо использовать его везде, где можно использовать обычное выражение (эта запятая внутри ваших вызовов функций - , а не оператор запятой, например), и это очень полезно при написании компактного исходного кода, если вам это нравится. Таким образом, это часть семейства, которое позволяет такие вещи, как:
while ((c= getchar()) != EOF) {...}
i = j = k = 0;
и т. д.
Для вашего конкретного примера:
while (c = getchar(), c != EOF && c != 'x')
происходит следующее:
c = getchar ()
выполняется полностью (оператор запятой является точкой последовательности). c! = EOF && c! = 'x'
выполняется. в то время как
использует это возвращаемое значение для управления циклом. Во многих языках запятая - это оператор, который всегда приводит к значению второго операнда. Операнды вычисляются последовательно слева направо.
Псевдокод:
a = 10
print a = 7 + 8, a * 2
Примечание: print
считается оператором, который не принимает аргументов, поэтому то, что идет после него, считается единственным выражением ] a = 7 + 8, a * 2
.
Выполняется так:
10
в a
7 + 8
( 15
) 15
) в a
a * 2
( 30
) ,
оператор с операндами 15
и 30
:
30
) 30
) Чтобы немного расширить другие ответы, в этом коде:
EXPRESSION_1 , EXPRESSION_2
EXPRESSION_1 сначала оценивается , то есть точка последовательности, затем вычисляется EXPRESSION_2, и значением всего этого является значение EXPRESSION_2.
Гарантия порядка работы и точка последовательности важны для указанного вами кода. Вместе,
Запятая - это оператор. По умолчанию он возвращает значение правого выражения . Гарантируется, что порядок оценки сначала слева, а затем справа.
Как и большинство операторов, его можно перегрузить для определенных пользователем типов:
#include <iostream>
#include <string>
using namespace std;
enum EntryType { Home, Cell, Address };
class AddressBookEntryReference {
public:
AddressBookEntryReference(const string& name, const EntryType &entry)
: Name(name), Entry(entry) { }
string Name;
EntryType Entry;
};
AddressBookEntryReference operator,(const string& name, const EntryType &type) {
return AddressBookEntryReference(name, type);
}
class AddressBook {
string test;
public:
string& operator[](const AddressBookEntryReference item) {
// return something based on item.Name and item.Entry.
// just to test:
test = item.Name;
return test;
}
};
int main() {
// demo:
AddressBook book;
cout << book["Name", Cell] // cool syntax!
<< endl;
}