Ограничения оператора запятой


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

int arr[3];
arr[0]=1,arr[1]=2,arr[2]=3;

Но когда я это сделаю:

int arr[3],arr[0]=1,arr[1]=2,arr[2]=3;

Это дает мне ошибку компилятора.

Я хочу спросить, каковы ограничения оператора запятой в реальной практике?

2 2

2 ответа:

Следует понимать, что не все случаи использования запятой в C являются экземплярами оператора запятой. Изменение вашего второго примера на синтаксическое объявление:

int a0=1,a1=2,a2=3;

Запятые-это не операторы,это просто синтаксис, необходимый для разделения экземпляров деклараторов в списке.

Кроме того, запятая, используемая в списках параметров/аргументов, не является оператором запятой.

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

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

Оператор запятой можно использовать практически везде, где может появиться выражение. Есть несколько исключений; в частности, нельзя использовать оператор запятой в константном выражении.

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

void f(int, bool);

f(42, 32, true);   // wrong
f((42, 32), true); // right (if such a thing can be considered "right")

Ваш пример-это объявление:

int arr[3],arr[0]=1,arr[1]=2,arr[2]=3;

В объявлении можно объявить несколько вещи, разделяя их запятыми, поэтому и здесь запятая используется в качестве разделителя. Кроме того, вы не можете просто прикрепить выражение к концу объявления, как это. (Обратите внимание, что вы можете получить желаемый результат, используя int arr[3] = { 1, 2, 3 };).