Оператор запятой с порядком скобок - PullRequest
0 голосов
/ 17 ноября 2018
#include<iostream>
#include<cstdlib>
using namespace std;

void func(int &x, int a) {
  x = abs(x-a);
}

int main()
{
    int x = 0;
    (func(x, 1), func(x, 2)), func(x, 3); 
    cout << x << endl;

    int y = 0;
    func(y, 1), (func(y, 2), func(y, 3));
    cout << x << endl;
}

Выход

2
2 

По сути, мой вопрос касается порядка выполнения a, (b, c) и (a, b), c. Похоже, что оба имеют тот же порядок, что и a, b, c, выполняются один за другим.

Теперь, думая , как оператор, в a, (b, c), почему (b, c) не выполняется первым и выводит 0 как конечный результат?

Я предполагаю, что правило вычисления b @ c в первую очередь, прежде чем вычислять @ (b @ c), не работает с ,, а круглые скобки не влияют на приоритет, я прав или нет?

1 Ответ

0 голосов
/ 17 ноября 2018

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

a, b, c

совпадает с

(a, b), c

, как мы начинаем слева, выполните a, затем b и закончитес c.

a, (b, c)

Делает то же самое.Мы начинаем слева с a, переходим к (b, c), который оценивает b, а затем c.

...