Есть ли у этой программы проблемы с точками последовательности? - PullRequest
1 голос
/ 28 августа 2010
#include<stdio.h>
 int main()
 {  
       int i=7,j;
       j=(i++,++i,j*i); 
       return 0;
}

j = (i ++, ++ i, j * i); это хорошо определено?Позвольте мне прояснить мои сомнения.

Ответы [ 3 ]

10 голосов
/ 28 августа 2010

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

(i++, ++i, j*i)

Однако не путайте его со следующими, где запятая не являетсявыступая в качестве точки последовательности:

somefunction(i++, ++i, j*i)

А как насчет j = i ++ * ++ i

Оператор умножения не является точкой последовательности.


( Извините, я угоняю ваш ответ )

Из п. 3.4 стандарта ISO 9899: 1999 (стандарт C):

3,4 поведения

внешний вид или действие

3.4.1 поведение, определяемое реализацией

неопределенное поведение, где каждая реализация документирует, как сделан выбор

ПРИМЕР ПримерПоведение, определяемое реализацией, - это распространение старшего бита, когда целое число со знаком сдвигается вправо.

3.4.2 Поведение, зависящее от локали

Поведение, которое зависит от местных соглашений национальности, культурыи язык, на котором каждая реализация документа

ПРИМЕР Пример поведения, зависящего от локали, - возвращает ли функция islower значение true для символов, отличных от 26 строчных латинских букв.

3.4.3 неопределенное поведение

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

ПРИМЕЧАНИЕ Возможные неопределенные варианты поведения варьируются от полного игнорирования ситуации с непредсказуемыми результатами до поведения во время перевода или выполнения программы вдокументированный характер, характерный для среды (с выдачей диагностического сообщения или без нее), для прекращения перевода или выполнения (с выдачей диагностического сообщения).

ПРИМЕР Примером неопределенного поведения является поведение нацелочисленное переполнение.

3.4.4 неопределенное поведение

поведение, когда этот международный стандарт предоставляет две или более возможностей и не предъявляет никаких дополнительных требований кhosen в любом случае

ПРИМЕР Примером неуказанного поведения является порядок, в котором оцениваются аргументы функции.

4 голосов
/ 28 августа 2010
1 голос
/ 28 августа 2010

В вашем коде "," будет работать как точка последовательности.

так в этом

j=(i++,++i,j*i);

выражение будет работать слева направо.
так что сначала я ++, потом ++ i, а затем j * i

при последнем j * я буду храниться в j;

но, наконец, ваш результат будет элегантным, потому что у "j" нет предопределенных данных
поэтому неопределенное значение будет сохранено в j.

если вы не используете "()"

ваш код будет работать как отдельный оператор, такой как

j=i++;
++i;
j*i;
...