Синтаксическая путаница в отношении циклов C while

#c

Вопрос:

Недавно я начал изучать C , и у меня возник вопрос относительно синтаксиса упражнения, данного в нашей лекции о точности, когда мы объявляем разные типы переменных, в данном случае float и double .

 #include <iostream>
using namespace std ;

int main()
{
    // Accuracy test with float
    float eps_f = 1.0 ;
    while (float(1.0   eps_f) != 1.0)
    eps_f /= 2.0 ;
    cout << "Resolving capacity float approximately: " << 2*eps_f << endl ;
    
     // Accuracy test with double
    double eps_d = 1.0 ;
    while (1.0   eps_d != 1.0)
    eps_d /= 2.0 ;
    cout << "Resolving capacity double approximately : " << 2*eps_d << endl ;
}
 

Итак, чего я не понимаю, так это в чем смысл пребывания здесь? Что происходит?

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

1. Вот почему правильный отступ и/или использование фигурных скобок так важны для написания читаемого кода. Например: второй цикл while (1.0 eps_d != 1.0) { eps_d /= 2.0; }

2. Я откатил редактирование, так как форматирование является частью проблемы здесь, как показали ответы.

Ответ №1:

В C отступ не влияет на поток программы, но влияет на читаемость.

Это может быть лучше написано как:

 #include <iostream>
using namespace std ;

int main()
{
    // Accuracy test with float
    float eps_f = 1.0 ;
    while (float(1.0   eps_f) != 1.0)
    {
        eps_f /= 2.0 ;
    }
    cout << "Resolving capacity float approximately: " << 2*eps_f << endl ;
    
     // Accuracy test with double
    double eps_d = 1.0 ;
    while (1.0   eps_d != 1.0)
    {
        eps_d /= 2.0 ;
    } 
    cout << "Resolving capacity double approximately : " << 2*eps_d << endl ;
}

 

Цикл while будет работать со следующим оператором. Если используются фигурные скобки, он будет рассматривать блок, заключенный в фигурные скобки, как инструкцию. В противном случае он будет использовать только следующую инструкцию.

Следующие фрагменты кода идентичны:

 while(1) 
{
    do_stuff();
}
 do_other_stuff();
 
 while(1) do_stuff(); do_other_stuff();
 
 while(1) 
do_stuff(); 
do_other_stuff();
 

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

1. Хотя ваш пример кода с отступом верен, написание //end while -плохая практика кодирования.

2. Спасибо за комментарий. Я больше использовал его как попытку продемонстрировать синтаксис блока. Я пошел дальше и удалил их.

Ответ №2:

Отступ имеет значение!

Вот фрагмент, переписанный заново путем добавления разумного отступа:

 while (float(1.0   eps_f) != 1.0)
    eps_f /= 2.0;
 

Теперь ясно, что цикл while выполняется до тех пор, пока сумма 1.0 и eps_f не станет 1.0 — это означает, что eps_f она стала настолько мала, что математика с плавающей запятой не может ее учесть.

То же изменение может быть применено ко второму while фрагменту с помощью double.

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

1. » Отступ имеет значение! «- только для читателей-людей, а не для составителя

2. @RemyLebeau ну, человеческие читатели тоже имеют значение!