i = 1, 2, 3, 4, 5;
это фактически присваивает 1
до i
.Что это за синтаксис?
***** Интересно, если этот тип задания является на самом деле полезно где-нибудь? *****
Вы знаете, некоторые приложения этого синтаксиса?
i = 1, 2, 3, 4, 5;
это фактически присваивает 1
до i
.Что это за синтаксис?
***** Интересно, если этот тип задания является на самом деле полезно где-нибудь? *****
Вы знаете, некоторые приложения этого синтаксиса?
Это не «тип присвоения». Оператор запятой связывается очень слабо, нежели назначение. Таким образом, вы написали эквивалент:
((((i = 1), 2), 3), 4), 5;
Целых литералы в ничтожных контекстах бесполезны (за исключением, может быть, для избежания предупреждений в макросах, которые ничего не делают, в некоторых случаях, как утверждает), так нет, нет никакой пользы для точности этот синтаксис - необходимость выражения, которое устанавливает i в 1 и оценивается до 5, довольно ограничена, и даже если вы нашли случай для этого, 2,3,4 являются избыточными.
Более полезным может быть i = 1, code_that_actually_does_something;
. Наиболее частое использование оператора запятой заключается в том, чтобы красться в нескольких побочных эффектах в контексте, когда вам не разрешено несколько операторов, таких как условия «if» и «while», или макросы, которые должны оцениваться как выражения.
Метафизический +1, потому что у меня нет веры (извините, я вернусь к вам, я обещаю). –
Этот синтаксис очень полезно, если вы хотите иметь, скажем 2 итерационные переменные в цикле
for (i = 0, j = 0; i < 10 && j < 10; i++) {
..
}
Ненавижу, что нужно продолжать раздавать их, но метафизически +1, потому что я не взобрался на следующие два часа. –
Это может быть единственный случай, когда я использовал этот синтаксис. Я съеживаюсь всякий раз, когда вижу его где-то еще. –
Применение: Obfuscated C Contest!
Это оператор запятой, оператор наименьшего приоритета C. Согласно правилам старшинства языка C, что линия разбирает как это:
(i = 1), (2), (3), (4), (5);
Это может быть «полезным», если вы хотите сделать что-то еще на этой линии:
i = 2, j = 3, k++;
может спасти вас от использования скобки a if()
(и может также вызвать головные боли позже) или позволить вам иметь несколько выражений в потоке управления циклом for()
(что на самом деле довольно законное использование оператора запятой).
Да. Единственное, что нужно добавить, это то, что запятая также часто используется для размещения нескольких объявлений одного и того же типа в одной строке: int i, j, cookies = 7, width, height; –
@Benji - это одна из вещей, которая запутывает уже запутанный оператор запятой. Эти запятые не являются операторами; они являются разделителями, требуемыми грамматикой C для нескольких деклараторов в списке init-declarator. Другие запятые, которые не являются операторами, включают те, которые разделяют параметры/аргументы функции и те, которые разделяют перечисления, когда они определяются. Возможно, есть и другие. –
Это comma operator, что позволяет комбинировать несколько выражений в одном.
Компилятор анализирует его как (i = 1), 2, 3, 4, 5
, потому что =
имеет более высокий приоритет, чем оператор запятой.
За исключением петель for
, он обычно не полезен, и его использование неодобрительно.
В задании я не могу придумать, где этот конкретный пример будет полезен.
Вы можете, однако, сделать
x = 1, y = 2, z = 3;
И они будут рассматриваться как одно утверждение, и вычисляются слева направо (по C89).
Другим часто используемым для оператора запятой в while
условиях цикла:
while (c = getchar(), c != EOF && c != '\n')
{
Как другие уже указывалось: Это утверждение присваивает 1 к I, а затем оценивает 2, а затем 3, затем 4 и затем 5 . Общая величина оператора равна 5 (последнее оцениваемое выражение).
Это полезно, когда вы хотите создать макрос, который делает несколько вещей, и возвращает значение, как функция:
#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);
...
несколько правильных ответов ниже. Где вы это видели? –
http://stackoverflow.com/questions/1613230/uses-of-c-comma-operator –
@Brian Postow это было задано в интервью, и я не смог ответить! – Moeb