Может кто-нибудь объяснить, почему этот код выводит 4?

#c

#c

Вопрос:

Вывод этого кода 4 , и я не понимаю почему. Кто-нибудь, пожалуйста, может объяснить, почему?

 #include <iostream>

using namespace std;
int main(){
    int val = 1;

    do{
        val  ;
          val;

    }while (val   > 25);
    cout << val << endl;

    return 0;
}
  

Комментарии:

1. Ну, потому что 4 < 25 и вы увеличиваете val в 3 раза.

2. @Bob__ потому что 4 <= 25, если вы хотите получить полную информацию об этом.

3. Быстрый прогон с вашим отладчиком был бы очень полезен.

4. Как вы думаете, результат должен быть чем-то другим? Если да, объясните, почему вы так думаете.

5. Голосование против, потому что вы думаете, что человек должен что-то знать, не является веской причиной для голосования против. Этот парень собрал пример и задал серьезный вопрос. Он просто не понимает имеющийся у него код, с которого мы все начинали (если мы только можем вспомнить, что было так давно) 🙂

Ответ №1:

 int val = 1;         // val is 1

do{
    val  ;           // val is 2 after statement
      val;           // val is 3 after statement

}while (val   > 25); // val is 3 within expression
                     // 3 > 25 is false so while loop exits.
                     // --
                     // After the expression
                     // val incremented with postfix    to 4.

cout << val << endl; // print val (which is 4)
  

Комментарии:

1. value is 4 Почему именно так? Объясните, пожалуйста.

2. Придирка: условие будет использовать val значение 3, потому что оно постфиксное .

Ответ №2:

С помощью цикла do while вы выполните тело цикла один раз, а затем оцените условие while, чтобы увидеть, следует ли это делать снова. Это означает, что вы делаете

 val  ;
  val;
  

создаем val 3 , а затем выполняем val в операторе condition. это делает val 4 , но оно возвращает 3 , поскольку это выражение после увеличения и поскольку 3 оно не больше 25 , вы выходите из цикла. Вот почему val имеет значение 4 .

Ответ №3:

Значение Val увеличится на 2 в пределах do в самый первый раз, и при проверке условия в блоке while для do while его значение увеличивается на 1. т.е. while (4> 25). Следовательно, значение Val будет равно 4.

Комментарии:

1. Первый параметр var инициализируется с 1, после этого post increment и pre increment. Здесь его значение равно 3. Теперь в while here оно также имеет приращение post. Итак, в конечном итоге его значение будет равно 4.

Ответ №4:

В строке int val = 1; val будет установлено значение 1. в строке val ; и в строке val; , val будет увеличиваться, поэтому после обоих, val будет установлено значение 3.

Теперь, вероятно, вы имели в виду while (val < 25) , но вы написали while (val > 25) . Таким образом, val будет увеличен до 4, но даст 3 из-за того, что выполняется после ввода, и сравнение 3 > 25 даст false результат, то есть цикл не будет зацикливаться.

После этого вы печатаете значение, равное 4.

Предполагая, что вы новичок в C , я также хочу намекнуть вам на ТО, чтобы НЕ использовать using namespace std; , а вместо этого писать std:: перед cout . Пространства имен были введены для предотвращения конфликтующих имен символов в библиотеках и т.д. И переноса всех символов в глобальное пространство имен с using namespace std; фактически полностью обходит цель, стоящую за пространствами имен.

Комментарии:

1. в случае «while (val < 25)» результат равен 28

2. Вы ожидали чего-то другого? К какой цели вы стремитесь?

Ответ №5:

Вы увеличиваете значение val в теле дважды, затем оно снова увеличивается там, где вы указали while .

 int main(){
int val = 1;

do{
    val  ; // val = 2
      val; // val = 3

}while (val   // val = 4 > 25); // then breaks the loop because 4 < 25.
cout << val << endl;

return 0;
}