MyTetra Share
Делитесь знаниями!
Операция запятая "," в языке Си и Си++
Время создания: 19.07.2023 14:21
Текстовые метки: язык, Си, Си++, C, C++, запятая, операция, оператор, выражение, синтаксис, приоритет, подводные камни
Раздел: Компьютер - Программирование - Язык C (Си)
Запись: xintrea/mytetra_syncro/master/base/1689765675uyu89w2siy/text.html на raw.github.com

Операция запятая "," позволяет объединить несколько выражений в одно выражение и, таким образом, в Си вводится понятие выражение с запятой, имеющее общий вид записи:


<выражение>, <выражение>, <выражение>, ...


Пара выражений, разделенных запятой, вычисляется слева направо. Тип и значение результата выражения с запятой есть тип и значение самого правого выражения. Например:


k=a+b,d=m+n,5.2+7;


- это выражение с запятой. Выражение вычисляется слева направо. Его значением является число с плавающей точкой 12.2 типа double.


Внимание! Данное выражение НЕ означает, что переменной k будет присвоено значение 12.2 ! В процессе вычисления этого выражения переменным k и d будут присвоены, соответственно, значения a+b и m+n.

А результатом работы всего выражения как раз и будет число 12.2. Только оно никуда записано не будет, потому что в данном примере нет присвоения значения всего выражения какой-то переменной.

Так происходит из-за приоритета операций: операция запятая имеет самый низкий приоритет, и выполняется в последнюю очередь.

Из-за этой особенности, часто можно встретить такую ошибку. Простое выражение:

c = 1, 2, 3, 4, 5;

может восприниматься разработчиком неправильно. Разработчик может подумать, что здесь c=5, однако это неверно. Операция присвоения имеет бОльший приоритет, и выполнится первой. Поэтому в конце работы данного выражения c=1, а результат всего выражения равен 5, но никуда не записывается.


Как получить значение всего выражения, в которой используется операция запятая? Надо воспользоваться скобками. Для выражения d=(k=5+2,5+3); значение переменной d будет 8, т.к. переменной d присваивается значение выражения с запятой, которое в свою очередь равно значению самого правого выражения-операнда.


Запятая в Си используется в двух контекстах: как разделитель списка объектов, например, в операторе описания данных, и как операция, определяющая последовательное вычисление выражений. Поэтому допустимо, например, такое описание с инициализацией: int a,b,c=(1,2,5),d; где переменная c инициализируется константным выражением с запятой 1,2,5 и принимает значение 5. Контекст знака запятая (операция или разделитель) компилятор "чувствует" по скобкам. Внутри скобок – это операция запятая, вне скобок – разделитель.


Забегая вперед, отметим, что аналогичная ситуация может возникнуть в списке фактических аргументов при обращении к функции. Обращение к функции, содержащее три аргумента, причем второй имеет значение 5, может выглядеть так: f(a,(t=3,t+2),c).


Чаще всего операция запятая используется в заголовках циклов, в местах, где синтаксис разрешает записать только одно выражение, а надо записать несколько. Тогда выражения объединяются в одно при помощи операции запятая. Например, когда нужно проинициализировать перед началом цикла несколько переменных или же увеличить/уменьшить в конце цикла несколько переменных:


for (i=1, j=2; i<n; j++,i++)

{

...

}


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования