В этом посте мы постараемся охватить много неоднозначных вопросов, таких как следующие.
Угадай вывод следующих программ.
|
Вывод всех вышеперечисленных программ не определен или не указан . Вывод может отличаться для разных компиляторов и разных машин. Это как запросить значение неопределенной автоматической переменной.
Причиной неопределенного поведения в ПРОГРАММЕ 1 является то, что оператор «+» не имеет стандартного определенного порядка вычисления для своих операндов. Либо f1 (), либо f2 () могут быть выполнены первыми. Таким образом, выходные данные могут быть «GeeksforGeeks» или «forGeeksGeeks».
Подобно оператору '+', большинство других подобных операторов, таких как '-', '/', '*', Побитовое И &, Побитовое ИЛИ |, .. и т. Д., Не имеют стандартного определенного порядка для вычисления своих операндов. ,
Оценка выражения также может привести к побочным эффектам. Например, в приведенной выше программе 2 конечные значения p неоднозначны. В зависимости от порядка вычисления выражения, если сначала выполняется f1 (), значение p будет равно 55, в противном случае — 40.
Вывод программы 3 также не определен. Это может быть 64, 72 или что-то еще. Подвыражение i ++ вызывает побочный эффект, оно изменяет значение i, что приводит к неопределенному поведению, поскольку на i также ссылаются в другом месте в том же выражении.
В отличие от описанных выше случаев, в определенных заданных точках в последовательности выполнения, называемых точками последовательности , все побочные эффекты предыдущих оценок гарантированно будут завершены . Точка последовательности определяет любую точку выполнения компьютерной программы, в которой гарантируется, что все побочные эффекты предыдущих оценок будут выполнены, и никаких побочных эффектов от последующих оценок еще не было выполнено. Ниже приведены точки последовательности, перечисленные в стандарте C:
— конец первого операнда следующих операторов:
а) логическое И & &&
б) логическое ИЛИ ||
в) условный?
г) запятая,
Например, выходные данные следующих программ гарантированно будут «GeeksforGeeks» на всех компиляторах / машинах.
|
— Конец полного выражения. Эта категория включает следующие выражения выражения
a) Любое полное утверждение заканчивается точкой с запятой, например «a = b;»
б) возврат заявления
c) Управляющие выражения операторов if, switch, while или do-while.
г) Все три выражения для утверждения.
Приведенный выше список точек последовательности является частичным. Мы рассмотрим все оставшиеся точки последовательности в следующем посте о точке последовательности.
Ссылки:
http://en.wikipedia.org/wiki/Sequence_point
http://c-faq.com/expr/seqpoints.html
http://msdn.microsoft.com/en-us/library/d45c7a5d(v=vs.110).aspx
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n925.htm
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Печатайте числа в последовательности, используя синхронизацию потоков
- Предопределенные макросы в C с примерами
- Как создать графический интерфейс в программировании на C, используя GTK Toolkit
- Библиотека ctype.h (<cctype>) в C / C ++ с примерами
- Слабые байты в структурах: объяснение на примере
- Разница между итераторами и указателями в C / C ++ с примерами
- C программа для подсчета количества гласных и согласных в строке
- Вложенные циклы в C с примерами
- Программа Hello World: первая программа во время обучения программированию
- Разница между аргументом и параметром в C / C ++ с примерами
- Неявное приведение типов в C с примерами
- <cfloat> float.h в C / C ++ с примерами
- C / C ++ #include директива с примерами
- C / C ++ if else оператор с примерами
0.00 (0%) 0 votes