2013-09-19 1 views
0

Когда я пытался выяснить, результат !0 определяется реализацией, ожидая, что он будет неравным нулю. Я просто прочитал что-то, что меня смутило.Пример оператора запятой в ansi c 1999 TC3

(Кстати это может быть на некоторых реализациях -1 или 1 или это строгое определено Если какой-либо один может мне сказать в комментарии было бы хорошо?)

Но мой реальный вопрос:

в

6.5.17 Разделенный оператор 2

сказано:

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

В следующей строке приведен пример того, как анализировать параметр в функции с использованием оператора запятой.

f(a, (t=3, t+2), c); 

Но, к примеру, пример моего знания пока неопределенного поведения, не так ли? С t получает присвоенный 3, а в следующей последовательности он увеличивается на 2.

Но в стандарте не упоминается, что пример недействителен.

Или задание не подлежит изменению как модификация?

+1

«Но стандарт не упоминает, что пример недействителен». Это означает, что пример действителен. – devnull

+0

Да, вы не говорите ... но мой вопрос был ПОЧЕМУ он действителен? как я понимаю правило, это не – dhein

+0

Операторы == (равные) и! = (не равные) аналогичны операциям реляционного , за исключением их более низкого приоритета.93) Каждый из операторов дает 1, если Указанное отношение истинно и 0, если оно ложно. нашел его сам. – dhein

ответ

3
  1. !0 вычисляет 1
  2. В (t=3, t+2), существует точка последовательности между назначением и доступа к t. Выражение определено, оно принимает значение 5 и оставляет значение 3 в t. Было бы не определено, если между ними не было точки последовательности, например (t=3)+(t+2).
+0

Но почему тогда 'printf ("% d% d ", t ++, ++ t)' недопустимо? является запятой в вызове функции, чтобы не понимать как последовательность? – dhein

+0

@Zaibis Точно. Запятые в 'printf ("% d% d ", t ++, ++ t)' не являются операторами запятой, а абзац в стандарте, в котором говорится, что запятые операторы являются точками последовательности, к ним не применимы. –

+0

ах, поэтому проанализированные параметры для функции являются одной последовательностью? – dhein

0

Оператор вводит запятой точку последовательности, так что поведение должно быть четко определены (первый t установлен в 3, то 2 добавляется к t с получением результата 5, но сохраняя 3 в t).

1

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

Как указано в синтаксисе, оператор запятой (как описано в данном подразделе) не может появиться в контекстах, где запятая используется для отдельные элементы в списке (например, аргументы для функций или списки инициализаторов). С другой стороны, его можно использовать в выражении в скобках или во втором выражении условного оператора в таких контекстах . В вызове функции

 f(a, (t=3, t+2), c) 

функция имеет три аргумента, второй из которых имеет значение 5.

ПОДЧЕРКНУЛ соответствующую часть, чтобы уточнить ваши сомнения.