Увеличение и уменьшение в циклах while - PullRequest
0 голосов
/ 27 апреля 2018

Это тип кода, с которым у меня проблемы, просто пример:

 #include <stdio.h>
 #define TEN 10
 int main(void)
 {
     int n = 0;
     while (n++ < TEN)
         printf("%5d", n);
     printf("\n");
     return 0;
 }

здесь оператор приращения сначала работает внутри цикла while, а n получает 1; и затем он снова работает с оператором printf () для цикла while, так что теперь n получает 2 и при первом выполнении оператора printf () выводится «1»? потому что иначе «0» был бы напечатан. Я не уверен, работает ли он таким образом, поэтому не могли бы вы объяснить это, как я прав? PS: У меня нет учителя, поэтому я прошу вас, ребята ...

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Хитрость в этом заключается в постфиксном операторе ++: он называется постинкрементным. Значение, используемое в выражении, если значение n перед инкрементом и n обновляется в некоторой точке перед следующей точкой последовательности, будь то конец выражения, вызов функции или запятая оператор, продвинутый оператор, который вам вряд ли понадобится в ближайшее время.

Другим предупреждением является специфическая обработка булевых значений в C: сравнения, такие как n < 10, оценивают как 1, если они истинны, и 0 в противном случае. И наоборот, тесты без сравнения (например, if (n) успешны для любых ненулевых, ненулевых и ненулевых значений.

Вот последовательность событий:

  • int n = 0 определяет и инициализирует локальную переменную n типа int значением 0.
  • while (n++ < TEN): n сравнивается с TEN, результат равен true (1 в C), поскольку 0 < 10 , тогда n увеличивается и получает значение 1. Результат сравнения верен, поэтому цикл while переходит к своему командному выражению.
  • printf("%5d", n); печатает значение n, которое равно 1.
  • выполнение переходит к циклическому тесту.
  • while (n++ < TEN): n снова сравнивается с TEN, результат все еще равен 1, поскольку 1 < 10 , тогда n увеличивается и получает значение 2. Результат сравнения верен, поэтому цикл while переходит к своему командному выражению.
  • printf("%5d", n); печатает значение n, которое составляет 2. Обратите внимание, что между этим и предыдущим выходом нет ни следующего, ни следующего.
  • выполнение переходит к циклическому тесту.
  • ... эти шаги повторяются до тех пор, пока 9 не будет напечатано
  • while (n++ < TEN): n сравнивается с TEN, результат равен 1, поскольку 9 < 10 , то n увеличивается и получает значение 10. Результат сравнения по-прежнему верен, поскольку сравнение было выполнено до приращения, поэтому цикл while переходит к своему командному оператору.
  • printf("%5d", n); печатает значение n, которое равно 10.
  • выполнение переходит к циклическому тесту.
  • while (n++ < TEN): n сравнивается с TEN, результат равен false (0 в C), поскольку 101 is not <10 <code>**then** n is incremented and gets the value 11 . The result of the comparison is false hence the, в то время как цикл `останавливается и управление переходит к следующему утверждению.
  • printf("\n"); печатает новую строку, заканчивая строку вывода 12345678910
  • return 0; функция main возвращается со статусом выхода 0, что означает успех.
0 голосов
/ 27 апреля 2018

n++ - это приращение post. См. Стандартный n1570 раздел 6.5.2.4

Результатом оператора postfix ++ является значение операнда. Как побочный эффект, значение объекта операнда увеличивается (что значение 1 соответствующего типа добавляется к нему).

while (n++ < TEN) /* 0 < 10 not 1 < 10 */ 
    printf("%5d", n);/* here incremented value gets printed */
...