Рубрики

Очки последовательности в C | Комплект 1

В этом посте мы постараемся охватить много неоднозначных вопросов, таких как следующие.

Угадай вывод следующих программ.

// ПРОГРАММА 1
#include <stdio.h>

int f1() { printf ("Geeks"); return 1;}

int f2() { printf ("forGeeks"); return 1;}

int main() 

  int p = f1() + f2();  

  return 0; 

}

  
// ПРОГРАММА 2
#include <stdio.h>

int x = 20;

int f1() { x = x+10; return x;}

int f2() { x = x-5;  return x;}

int main()

{

  int p = f1() + f2();

  printf ("p = %d", p);

  return 0;

}

  

  
// ПРОГРАММА 3
#include <stdio.h>

int main()

{

   int i = 8;

   int p = i++*i++;

   printf("%d\n", p);

}

Вывод всех вышеперечисленных программ не определен или не указан . Вывод может отличаться для разных компиляторов и разных машин. Это как запросить значение неопределенной автоматической переменной.

Причиной неопределенного поведения в ПРОГРАММЕ 1 является то, что оператор «+» не имеет стандартного определенного порядка вычисления для своих операндов. Либо f1 (), либо f2 () могут быть выполнены первыми. Таким образом, выходные данные могут быть «GeeksforGeeks» или «forGeeksGeeks».
Подобно оператору '+', большинство других подобных операторов, таких как '-', '/', '*', Побитовое И &, Побитовое ИЛИ |, .. и т. Д., Не имеют стандартного определенного порядка для вычисления своих операндов. ,

Оценка выражения также может привести к побочным эффектам. Например, в приведенной выше программе 2 конечные значения p неоднозначны. В зависимости от порядка вычисления выражения, если сначала выполняется f1 (), значение p будет равно 55, в противном случае — 40.

Вывод программы 3 также не определен. Это может быть 64, 72 или что-то еще. Подвыражение i ++ вызывает побочный эффект, оно изменяет значение i, что приводит к неопределенному поведению, поскольку на i также ссылаются в другом месте в том же выражении.

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

— конец первого операнда следующих операторов:
а) логическое И & &&
б) логическое ИЛИ ||
в) условный?
г) запятая,

Например, выходные данные следующих программ гарантированно будут «GeeksforGeeks» на всех компиляторах / машинах.

// Следующие 3 строки являются общими для всех приведенных ниже программ
#include <stdio.h>

int f1() { printf ("Geeks"); return 1;}

int f2() { printf ("forGeeks"); return 1;}

  
// ПРОГРАММА 4

int main() 

   // Поскольку && определяет точку последовательности после первого операнда, это

   // Гарантируем, что f1 () завершается первым.

   int p = f1() && f2();  

   return 0; 

}

  
// ПРОГРАММА 5

int main()

{

   // Поскольку оператор запятой определяет точку последовательности после первого операнда, он

   // Гарантируем, что f1 () завершается первым.

  int p = (f1(), f2());

  return 0;

}

  

  
// ПРОГРАММА 6

int main() 

   // Поскольку ? Оператор определяет точку последовательности после первого операнда, это

   // Гарантируем, что f1 () завершается первым.

  int p = f1()? f2(): 3;  

  return 0; 

}

— Конец полного выражения. Эта категория включает следующие выражения выражения
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 | Комплект 1

0.00 (0%) 0 votes