Распространенной идиомой является использование оператора с запятыми , который вычисляет оба операнда и возвращает второй операнд. Таким образом:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
Но действительно ли это оператор запятой?
Теперь, написав это, комментатор предположил, что это действительно какой-то особый синтаксический сахар в операторе for, а не оператор запятой вообще. Я проверил это в GCC следующим образом:
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d\n",i,a,x);
}
Я ожидал, что x выберет исходное значение a, поэтому он должен был отобразить 5,6,7 .. для x. Я получил это
i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3
Однако, если я заключил в скобки выражение, чтобы заставить парсер действительно увидеть оператор запятой, я получу это
int main(){
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++)){
printf("i=%d a=%d x=%d\n",i,a,x);
}
}
i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
Первоначально я думал, что это показывает, что он вообще не работает как оператор запятой, но, как оказалось, это просто проблема приоритета - оператор запятой имеет минимально возможный приоритет , поэтому выражение x = i ++, a ++ эффективно анализируется как (x = i ++), a ++
Спасибо за все комментарии, это был интересный опыт обучения, и я использую C много лет!