C использует запятую (,
) двумя различными способами: в качестве разделителя элементов в составных конструкциях, таких как литералы массивов или списки деклараций, и как двоичный оператор. Он не имеет назначение на основе списка, например, некоторые языки более высокого уровня.
В качестве оператора сначала запятая оценивает левый операнд, а затем оценивает его правый операнд. Значение общего выражения является вторым результатом. Это в некотором роде дополняет операторы &&
и ||
, оба из которых сначала оценивают свои левые операнды, но каждый из них оценивает свой правый операнд только условно, в зависимости от левого результата.
Другой ключ к пониманию вашего наблюдения заключается в том, что знак равенства (=
) равен также оператор. Он оценивает оба операнда в неуказанном порядке, и его результат совпадает с правым операндом. Изменение значения левого операнда является побочным эффектом.
Оператор присваивания имеет очень низкий приоритет, но оператор запятой имеет самый низкий приоритет для всех. Поэтому, если вы не используете круглые скобки, чтобы изменить порядок оценки, это ...
a = 4,3;
... эквивалентно ...
(a = 4), 3;
. Сначала он оценивает назначение, получая значение 4
с побочным эффектом присвоения этого значения переменной a
. Затем он отбрасывает это значение и оценивает 3
, что дает значение 3
в качестве общего результата. Поскольку все это не является частью какого-либо большего выражения, результат отбрасывается.
С другой стороны, вы можете изменить приоритет с соответствующим использованием скобок, так как в этом:
a = (4, 3);
. В этом случае сначала вычисляется оператор запятой, получая в качестве результата 3
, и это правый операнд оператора присваивания.Выражение присваивания дает результат 3
, с побочным эффектом присвоения этого значения переменной a
.
Можете ли вы опубликовать код, который вы используете для тестирования? –