Подтвердить что ты не робот

Почему вставка скобок вокруг списка разделенных запятыми значений меняет назначение?

Пожалуйста, рассмотрите следующий код,

    int i;

    i = 1,2,3,4,5;
    printf("First time i = %d\n",i);

    i = (1,2,3,4,5);
    printf("Second time i = %d\n",i);   

Вывод:

Первое время я = 1

Второе время я = 5


Почему скобки заставляют оператор запятой принимать последнее значение и без скобок оно принимает первое значение?

Спасибо заранее.

4b9b3361

Ответ 1

Первый эквивалент (i = 1),2,3,4,5;, что означает, что запятые не действуют. При использовании с круглыми скобками возвращается последнее значение в "список с разделителями-запятыми"

Все это связано с приоритетом оператора, который вы можете просмотреть в таблице здесь

Ответ 2

Это связано с приоритетом оператора и порядком оценки. = привязывается сильнее, чем ,, и из этого мы можем понять, что следующие два выражения одинаковы:

i = 1,2,3,4,5 /* <- same as -> */ (i = 1),(2),(3),(4),(5)

side-note: оператор запятой является "самым слабым" из них всех


Почему оператор запятой возвращает последнее значение нашего списка?

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


Где я могу узнать больше об этой теме?

Ответ 3

Поскольку = имеет более высокий приоритет, чем , (который имеет самый низкий), первый такой же, как

(i = 1),2,3,4,5;

который присваивает 1 i (i = 1), затем вычисляет выражения 2, 3, 4 и 5 через запятые (все выражение фактически приводит к 5, который не используется). Во втором,

(1,2,3,4,5)

заключен в скобки, поэтому он будет сначала оценен до =. В результате получается 5 (самое правое выражение, это поведение оператора запятой), которое затем присваивается i.

i = (1,2,3,4,5);
    |         |
    \---------\--- results in 5 then is assigned to i

См. приоритет оператора Статья в Википедии.

Ответ 4

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

Почему скобки приводят к тому, что оператор запятой принимает последнее значение и без скобок он принимает первое значение?

Поскольку скобка используется для переопределения приоритета. Первый случай неявно эквивалентен:

(i = 1),2,3,4,5;

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

Оператор с запятой имеет ассоциативную ассоциацию слева направо. Два выражения, разделенные запятой, оцениваются слева направо. Левый операнд всегда оценивается, и все побочные эффекты завершаются до того, как будет оценен правый операнд.