Об этом спрашивали в интервью. Каков вывод приведенного ниже фрагмента?
#include <iostream>
using namespace std;
int main() {
cout << (3,2,1)-(1,2,3) << endl; // in C++ too this prints -2
printf("%d\n",(3,2,1)-(1,2,3)); // prints -2
printf("%d\n",("%d",3,2,1)-(1,2,3)); // prints -2
return 0;
}
По выводу угадываю его (1-3) = -2. Но как из (3,2,1)
значение 1
выбирается аналогично из (1,2,3)
значение 3
выбран? Я прав в том, что я предполагаю?
Здесь оператор запятой и это свойство используется.
Разрабатывать, от C11
глава §6.5.17, Оператор запятой
Левый операнд оператора запятой оценивается как пустое выражение; существует последовательность между его оценкой и оценкой правого операнда. Затем вычисляется правый операнд; результат имеет свой тип и значение
и из C++11
глава § 5.18,
Пара выражений, разделенных запятой, оценивается слева направо; левое выражение является выражением отброшенного значения (раздел 5). Каждое вычисление значения и побочный эффект, связанный с левым выражением, упорядочивается перед каждым вычислением значения и побочным эффектом, связанным с правым выражением. Тип и значение результата — это тип и значение правого операнда; результат имеет ту же категорию значения
как его правый операнд, и является битовым полем, если его правый операнд является glvalue и битовым полем.
Таким образом, в случае заявления, как
(3,2,1)-(1,2,3)
для оценки,
(3,2,1)
3 и 2 (оцениваются как void
выражение а) отбрасывается, 1 — это значение.(1,2,3)
1 и 2 (оцениваются как void
выражение а) отбрасывается, 3 — это значение.Итак, утверждение сводится к 1 - 3
который равен -2
,
Таким же образом, вы можете использовать и для большего количества элементов.
(3,2,1)
означает вычислить все выражения и вернуть последний.
Итак, это делает:
И другие:
Так что ваши
cout << (3,2,1)-(1,2,3) << endl;
средства:
cout << 1 - 3 << endl;
Вы должны рассмотреть запятую оператор (,)
Оператор запятой (,) используется для разделения двух или более выражений
которые включены, когда ожидается только одно выражение. Когда установлен
выражений должен быть оценен для значения, только самый правый
выражение считается.
В твоем случае:
(3,2,1) //evaluates to 1
(1,2,3) //evaluates to 3
Запятая всегда возвращает последнее значение, т.е.
cout
это 1-3 = -2printf
опять это 1-3 = -3printf
, опять 1-3 = -2Оператор запятой всегда решает все левые выражения (операнды) и просто возвращает самый правый операнд как результат rvalue
,