Почему вставка скобок вокруг списка разделенных запятыми значений меняет назначение?
Пожалуйста, рассмотрите следующий код,
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
Почему скобки заставляют оператор запятой принимать последнее значение и без скобок оно принимает первое значение?
Спасибо заранее.
Ответы
Ответ 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 оценивает слева направо, а самое правое значение - значение всего выражения. Здесь читайте .
Оператор с запятой имеет ассоциативную ассоциацию слева направо. Два выражения, разделенные запятой, оцениваются слева направо. Левый операнд всегда оценивается, и все побочные эффекты завершаются до того, как будет оценен правый операнд.