Присвоение значения в условии цикла с условием продолжения

Интересный вопрос. После небольшого количества поиска "Частичное Функциональное Приложение не приправляет карри" , дал лучшее объяснение, которое я нашел. Я не могу сказать, что практичный различие особенно очевидно для меня, но тогда я не эксперт по FP...

Другая полезно выглядящая страница (который я признаюсь, что еще не полностью читал) "Приправляющее карри и Частичное Приложение с Закрытиями Java" .

действительно похоже, что это - широко перепутанная пара терминов, заметьте.

13
задан Josip 16 July 2009 в 10:52
поделиться

5 ответов

Оператор запятой - это бинарный оператор, который оценивает свой первый операнд и отбрасывает результат, это затем оценивает второй операнд и возвращает это значение.

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

17
ответ дан 1 December 2019 в 19:31
поделиться

Оператор запятая - странный зверь, пока вы не поймете его, и он не специфичен для , а .

Выражение:

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' выполняется.
  • оператор запятой отбрасывает первое значение (c) и "возвращает" второе.
  • в то время как использует это возвращаемое значение для управления циклом.
11
ответ дан 1 December 2019 в 19:31
поделиться

Во многих языках запятая - это оператор, который всегда приводит к значению второго операнда. Операнды вычисляются последовательно слева направо.

Псевдокод:

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 )
4
ответ дан 1 December 2019 в 19:31
поделиться

Чтобы немного расширить другие ответы, в этом коде:

EXPRESSION_1 , EXPRESSION_2

EXPRESSION_1 сначала оценивается , то есть точка последовательности, затем вычисляется EXPRESSION_2, и значением всего этого является значение EXPRESSION_2.

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

2
ответ дан 1 December 2019 в 19:31
поделиться

Запятая - это оператор. По умолчанию он возвращает значение правого выражения . Гарантируется, что порядок оценки сначала слева, а затем справа.

ОБНОВЛЕНИЕ (ответ на комментарий Pax):

Как и большинство операторов, его можно перегрузить для определенных пользователем типов:

#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;
}
1
ответ дан 1 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: