Может кто-нибудь прояснить эту концепцию для получаемого мной результата?

Об этом спрашивали в интервью. Каков вывод приведенного ниже фрагмента?

#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 выбран? Я прав в том, что я предполагаю?

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,

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

10

Другие решения

(3,2,1) означает вычислить все выражения и вернуть последний.
Итак, это делает:

  • 3 — ничего
  • 2 — ничего
  • 1 — возврат 1

И другие:

  • 1 — ничего
  • 2 — ничего
  • 3 — возврат 3

Так что ваши

cout << (3,2,1)-(1,2,3) << endl;

средства:

cout << 1 - 3 << endl;
3

Вы должны рассмотреть запятую оператор (,)

Оператор запятой (,) используется для разделения двух или более выражений
которые включены, когда ожидается только одно выражение. Когда установлен
выражений должен быть оценен для значения, только самый правый
выражение считается.

В твоем случае:

(3,2,1) //evaluates to 1
(1,2,3) //evaluates to 3

источник:
http://www.cplusplus.com/doc/tutorial/operators/

1

Запятая всегда возвращает последнее значение, т.е.

  1. в вашем первом cout это 1-3 = -2
  2. затем, в printf опять это 1-3 = -3
  3. наконец-то в прошлом printf, опять 1-3 = -2

Оператор запятой всегда решает все левые выражения (операнды) и просто возвращает самый правый операнд как результат rvalue,

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector