Разница между переключателем и приращением и оценкой - PullRequest
0 голосов
/ 01 июня 2018

Если i равно 1, после этого оператора

while (i++ <= 10){} 

i принимается за 2, т.е. увеличивается до оценки в блоке.

Но если используетсяв переключателе

switch(i++){} 

i вычисляется до увеличения в блоке.

Почему эти случаи i++ ведут себя по-разному?

Примеры:

Для случая "В то время как":

#include <stdio.h>

int main()
{
    int age = 20;

    while (age++ <= 65)
    {
        if ((age % 20) == 0)
        {
            printf("You are %d years old\n", age);
        }       
    }

    return 0;
}

Я ожидаю, что это напечатает:

You are 20 years old
You are 40 years old
You are 60 years old

Для случая переключателя:

#include <stdio.h>

int main()
{
 int i = 0;

 while (i < 3)
 {
     switch (i++)
     {
         case 0:printf("print 0");
         case 1:printf("print 1");
         case 2:printf("print 2");
         default:printf("Oh no!");
     }
     putchar('\n');
 }

 return 0;
}

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Цикл while не будет печатать You are 20 years old, поскольку переменная увеличивается до выполнения тела цикла.Это началось как age = 20.Первый

while (age++ <= 65)

проверяет, является ли 20 <= 65, поэтому он входит в цикл.Затем он увеличивается age, поэтому внутри цикла это age = 21.В результате проверка if (age % 20 == 0) не будет выполнена успешно, и вы не получите сообщение о том, что You are 20 years old.

Другие кратные 20 все еще печатаются во время будущих итераций цикла.

0 голосов
/ 01 июня 2018

Нет, этого не может быть.

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

Цитирование C11, глава §6.5.2.4, ( выделение мое )

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

Для уточнения

  • В случае while (i++ <= 10) значениеi, перед тем как приращение используется для проверки условия цикла.

  • В случае switch(i++){} значение i, перед приращением, используется для перехода к конкретномудело.Немодифицированное (пока) значение используется в качестве значения управляющего выражения, и после вычисления управляющего выражения происходит приращение.

Чтобы добавить, если вы пытаетесь распечататьзначение i в одном из операторов case (скажем, case 1:), вы можете видеть, что оно фактически увеличено.

0 голосов
/ 01 июня 2018

На самом деле, в обоих случаях происходит одно и то же: исходное значение используется для сравнения, оно увеличивается и блок выполняется.Посмотрите на следующий код:

#include <stdio.h>

int main() {
    int i=1;

    switch(i++) {
    case 1:
        printf("Case 1: %d\n", i);
        break;
    default:
        printf("Not 1: %d\n", i);
    }
    return 0;
}

Его вывод:

Case 1: 2

, который доказывает, что i был увеличен до , когда блок оценивается.

0 голосов
/ 01 июня 2018

С этим

while (i++ <= 10){} 

происходит следующее:

  • я начинаю, когда 1
  • i (будучи одним) сравнивается с 10
  • i увеличивается до 2
  • блок выполняется, с i = 2

Интересно отметить, что если я начинаю с 10, цикл while будет выполняться сновас i = 11.

При этом:

switch(i++){}
  • i начинается с 1
  • case для выполнения выбирается в соответствии с "1"
  • i увеличивается до 2
  • , выполняется регистр" 1 ", где i равно" 2 "
...