2009-11-05 5 views
3
i = 1, 2, 3, 4, 5; 

это фактически присваивает 1 до i.Что это за синтаксис?

***** Интересно, если этот тип задания является на самом деле полезно где-нибудь? *****

Вы знаете, некоторые приложения этого синтаксиса?

+0

несколько правильных ответов ниже. Где вы это видели? –

+0

http://stackoverflow.com/questions/1613230/uses-of-c-comma-operator –

+0

@Brian Postow это было задано в интервью, и я не смог ответить! – Moeb

ответ

5

Это не «тип присвоения». Оператор запятой связывается очень слабо, нежели назначение. Таким образом, вы написали эквивалент:

((((i = 1), 2), 3), 4), 5; 

Целых литералы в ничтожных контекстах бесполезны (за исключением, может быть, для избежания предупреждений в макросах, которые ничего не делают, в некоторых случаях, как утверждает), так нет, нет никакой пользы для точности этот синтаксис - необходимость выражения, которое устанавливает i в 1 и оценивается до 5, довольно ограничена, и даже если вы нашли случай для этого, 2,3,4 являются избыточными.

Более полезным может быть i = 1, code_that_actually_does_something;. Наиболее частое использование оператора запятой заключается в том, чтобы красться в нескольких побочных эффектах в контексте, когда вам не разрешено несколько операторов, таких как условия «if» и «while», или макросы, которые должны оцениваться как выражения.

+0

Метафизический +1, потому что у меня нет веры (извините, я вернусь к вам, я обещаю). –

15

Этот синтаксис очень полезно, если вы хотите иметь, скажем 2 итерационные переменные в цикле

for (i = 0, j = 0; i < 10 && j < 10; i++) { 
    .. 
} 
+1

Ненавижу, что нужно продолжать раздавать их, но метафизически +1, потому что я не взобрался на следующие два часа. –

+2

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

14

Это оператор запятой, оператор наименьшего приоритета C. Согласно правилам старшинства языка C, что линия разбирает как это:

(i = 1), (2), (3), (4), (5); 

Это может быть «полезным», если вы хотите сделать что-то еще на этой линии:

i = 2, j = 3, k++; 

может спасти вас от использования скобки a if() (и может также вызвать головные боли позже) или позволить вам иметь несколько выражений в потоке управления циклом for() (что на самом деле довольно законное использование оператора запятой).

+0

Да. Единственное, что нужно добавить, это то, что запятая также часто используется для размещения нескольких объявлений одного и того же типа в одной строке: int i, j, cookies = 7, width, height; –

+2

@Benji - это одна из вещей, которая запутывает уже запутанный оператор запятой. Эти запятые не являются операторами; они являются разделителями, требуемыми грамматикой C для нескольких деклараторов в списке init-declarator. Другие запятые, которые не являются операторами, включают те, которые разделяют параметры/аргументы функции и те, которые разделяют перечисления, когда они определяются. Возможно, есть и другие. –

3

Это comma operator, что позволяет комбинировать несколько выражений в одном.

Компилятор анализирует его как (i = 1), 2, 3, 4, 5, потому что = имеет более высокий приоритет, чем оператор запятой.

За исключением петель for, он обычно не полезен, и его использование неодобрительно.

0

В задании я не могу придумать, где этот конкретный пример будет полезен.

Вы можете, однако, сделать

x = 1, y = 2, z = 3; 

И они будут рассматриваться как одно утверждение, и вычисляются слева направо (по C89).

6

Другим часто используемым для оператора запятой в while условиях цикла:

while (c = getchar(), c != EOF && c != '\n') 
{ 
+0

Проклятия! Еще один метафизический +1! –

+0

Оператор запятой, очевидно, очень полезен для предотвращения управления ошибками. – sharkin

+0

'getchar' возвращает EOF при любой ошибке, поэтому код обработки ошибок будет после цикла. – caf

0

Как другие уже указывалось: Это утверждение присваивает 1 к I, а затем оценивает 2, а затем 3, затем 4 и затем 5 . Общая величина оператора равна 5 (последнее оцениваемое выражение).

0

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

#define STEAL_MAGIC_HAT(thing1, thing2, cat) \ 
(smack(thing1), punch(thing2),get_hat(cat)) 

extern thing_t g_thing1, g_thing2; 
extern cat_t g_cat; 
... 

    hat_t hat = STEAL_MAGIC_HAT(g_thing1, g_thing2, g_cat); 
    don(hat); 
... 
Смежные вопросы