Здесь есть две проблемы:
Объявление локальной переменной с тем же именем, что и у глобальной переменной, делает их двумя отдельными объектами, что может привести к путанице. Это явление называется Затенение переменной .
Вы сравниваете переменную duration
, которая на самом деле является объектом класса sec
и не является целым числом или числом с плавающей запятой . Итак, для сравнения значения в duration
просто сделайте duration.count()
, чтобы сделать его сопоставимым с целочисленными значениями или значениями с плавающей запятой.
Здесь, в вашем коде, глобальная переменная duration
никогда не изменяется, поскольку вы объявляете новую переменную внутри цикла while. Переменная duration
, которая была проверена в условии while, является глобальной переменной duration
, но вы ожидаете, что она будет переменной продолжительности внутри цикла.
Существует два возможных решения:
Либо сделайте две переменные duration
одинаковыми.
Или прервать цикл while(1)
, когда значение переменной удержания duration
>= 5
,
Код решения 1 выглядит следующим образом:
#include <iostream>
#include <Windows.h>
#include <chrono>
using namespace std;
int main()
{
using clock = std::chrono::system_clock;
using sec = std::chrono::duration <double>;
sec duration;
const auto before = clock::now();
while (duration.count() < 5.0)
{
const auto after = clock::now();
duration = after - before;
std::cout << "It took " << duration.count() << "s" << std::endl;
}
std::cout << "After While Loop "; //Never reaches this line!!!!!
return 0;
}
Код решения 2 выглядит следующим образом:
#include <iostream>
#include <Windows.h>
#include <chrono>
using namespace std;
int main()
{
using clock = std::chrono::system_clock;
using sec = std::chrono::duration <double>;
const auto before = clock::now();
while (1) // Soln 1: while(1)
{
const auto after = clock::now();
const sec duration = after - before;
std::cout << "It took " << duration.count() << "s" << std::endl;
if(duration.count() >= 5)
break;
}
std::cout << "After While Loop "; //Never reaches this line!!!!!
return 0;
}