Ограничения оператора запятой - PullRequest
2 голосов
/ 28 декабря 2010

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

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 ]

10 голосов
/ 28 декабря 2010

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

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

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

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

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

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

5 голосов
/ 28 декабря 2010

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

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

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 };).

...