Intereting Posts
Как использовать все ядра в Windows 7? gcc: Невозможно создать .so из объектных файлов Как реализовать деревья сегментов с ленивым распространением? как создать рекурсивные каталоги для следующего требования в c? Что означает звездочка в спецификаторе формата scanf? Как связать пользовательский C (который сам нуждается в специальных ссылках для компиляции) с Cython? Передача основных аргументов для функций init библиотек gui Ошибка слияния памяти В чем разница – 1) Препроцессор, компоновщик, 2) Файл заголовка, библиотека? Правильно ли я понимаю? Как я могу сделать автоматическое управление памятью в C? Разделить строку на токены в C, когда в строке 2 разделителя операции pre и post increment на переменной дают разные результаты на TC и gcc Добавление уникальных значений только в связанном списке в C привязка системных вызовов Android кодировать программу, используя getchar из аргумента командной строки и putchar для отправки на декодирование

Поведение оператора запятой в C

Если я пишу код с помощью оператора запятой, например:

int i; i = 5, i++, i++; 

вызывает ли это неопределенное поведение?

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

    = имеет более высокий приоритет, чем оператор оператора, и поэтому 5 связывается с = as

     (i = 5), i++, i++; 

    Поскольку операнды оператора запятой гарантированно оцениваются слева направо, сначала будет оцениваться i = 5 , и i будет присвоено значение 5 , тогда будет оценено второе выражение i++ , и i будет равен 6 и, наконец, третье выражение будет увеличивать i до 7 ,

    Вышеприведенное утверждение эквивалентно

     i = 5; i++; i++; 

    вызывает ли это неопределенное поведение?

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

    Точки последовательности и операторные условия гарантируют, что в i = 5, i++, i++; , i буду инициализирован перед оценкой любого из выражений i++ .

    Заявление:

     i = 5, i++, i++; 

    является, учитывая приоритет оператора , эквивалентный:

     ((i = 5), i++), i++; 

    Итак, сначала (i = 5) оценивается. После того, как его побочные эффекты закончатся (т.е.: после того, как i инициализируется до 5 ), оценивается следующее выражение i++ . Опять же, после побочного эффекта, которое вводится это последнее выражение (т. i увеличивается на единицу), вычисляется последнее выражение i++ .

    Нет , не вызывает неопределенное поведение, потому что оператор запятой является точкой последовательности. i присваивается значение 5 а затем увеличивается в два раза.