while (1) в Си
Мне тут недавно обхяснили, что численное значение TRUE — единица. Остальное можешь додумать сама.
понятно, то есть если у меня вот такая запись
while(1)
.
if (p=NULL)break;
>
то процедура крутится, пока p не равно NULL?
а функция exit(1 что тогда означает?
функция exit(1) говорит о том, что нужно выйти из форума с кодом 1 и наконец почитать хотя бы одну книжку из серии «Язык программирования C для начинающих за 37 минут!»
> то процедура крутится, пока p не равно NULL?
там точно только один знак ‘=’?
если все-таки два знака равенства, то да — цикл крутится пока p не равно NULL.
если один, то это ошибка, p — будет в первой же итерации приравен нулю, и цикл будет крутиться вечно.
> функция exit(1
выход из программы с кодом возврата 1.
а функция exit(1 что тогда означает?
Она означает, что тебе надо запустить man 1 exit
А если серъёзно — думаю, что завершение программы с кодом 1
while(1)
.
if (p=NULL)break;
>
то процедура крутится, пока p не равно NULL?
а функция exit(1 что тогда означает?
Да, верно, хотя здесь красивее было бы написать
do .
>
while(p!=NULL);
exit(1) — прервать работу программы с кодом ошибки =1 (0 — без ошибки). Правда обычно на код ошибки никто не смотрит, поэтому можно считать, что просто прервать работу программы.
exit(1)
означает завершение процесса с кодом выхода 1.
ЗЫ Вообщето надо читать документацию, тогда подобныеотпадут.
Правда обычно на код ошибки никто не смотрит
Если это программа, которую надо сдать преподу по информатике и забыть — да.
А если это модуль крупного проекта — ты очень не прав.
всем спасибо
действительно, там 2 знака равенства (p==NULL)
и действ-но, это прогр-ма, кот нужно сдать преп-лю и забыть
тем не менее, читать документацию стоит.
да я итак читаю
а можно узнать, что конкретно ты читаешь?
первое, что под рукку попало- Подбельский и Фомин «прогр-е на яз Си»
а под какой поерационной системой пишешь?
исходник программы одногруппника
странно, что там не описана семантика цикла while и вычисление логических выражений в СИ.
Угу, нам тоже её рекоендовали — хреновая книжка.
Могу посоветовать очень хорошую книжку Страуструпа — продаётся за ~400 в аргументе, ~500 в букинисте — там, по сути, написано вообще всё о си++
это я вообще то спросил..
Оч. хорошая книжка для начинающих.
Угу, нам тоже её рекоендовали — хреновая книжка.
нормальная книжка.
Могу посоветовать очень хорошую книжку Страуструпа.
чтобы написать программу в универе и забыть, не обязательно ее читать
Из этой книжки я, в частности, так и не смог понять — как именно перегружать операторы. там даже примеров нормальных нет. задавать пришлось смотреть рограмму знакомого. и в результате, я только совсем недавно нормально узнал хоть что-то об операторах.
чудесная книжка!
Четай, четай, меньше фтыкай ф форум и будет тебе счастье!
И не пишы сюда, некреативно.
чуве, речь идет о С, насколько я понял.
Да, протупил, сорри.
Но не думаю, что книжка подбельского/фомина по си написаноа сильно лучше, чем их же — по си++.
Кстати, это какой курс, что используется простой си? Первый, что ли
вмк 2ой осенний семестр
UNIX и язык Си
Дорогой друг, не сбивайте девушку с Пути.
Общение с наставников — важная часть духовного роста. А здесь наставников даже несколько.
Странно. на ММ уже вовсю ООП идёт.
вмк 2ой весенний ООП и Язык С++
забываете о химиках и физиках!
фиговый из тебя наставник, если сразу недопер
Очевидно, что нужно читать Чернокнижку
Обязательно ночью и при полной луне.
Подбельского-Фомина нужно в чёрный список внести, слишком уж он запутывает студентов.
Очень полезная книжка — только в ней была описана процедура, выполняя которую ваша программа не вываливается, когда в качестве аргумента при вызове задаётся очченннььь длинная строка
void f(const char* s) <>
А разве, если известно, что такое переполнение буфера ввода, непонятно, как это можно обойти
не все студенты это понимают, а если программа списана — непонимают вдвойне.
Можно, там, насколько сейчас помню, не считанные символы из командной строки (или из буфера scanf) выгребались с помощью getchar:
while (getchar != '\n');
зачем такие тонкости нужны?
разве в задании требуется какие-то заумные ошибки обходить?
Это не «заумные ошибки», а огромная дыра. Кстати, подавляющее большинство дыр в ПО как раз происходят из-за переполнения буфера.
в ПО то бесспорно, но в проге для препа то пох
Да-да, причем проценты там какие-то дикие.
А практически всё оставшееся, думаю — разнообразные injections.
Хотя, если подумать — по идее, вообще любая ошибка связана с тем, что мы начинаем исполнять пользовательский ввод.
Сто пудофф, 99.9% программ страдают от переполнения буфера, а оставшиеся 0.1% от injections.
но в проге для препа то пох
Преподы разные бывают.
Далеко не любая. Многочисленные race conditions тому примером.
думаю это просто один цикл закончится когда будет 1, не путай с true
Непонятно условие цикла — while(1)
Друзья, подскажите, в скобках условия цикла while — единица. Это алгоритм «двоичный поиск». Алгоритм работает, но эта единица в условии цикла непонятна:
while(1)
Отслеживать
задан 11 янв 2012 в 12:43
77 2 2 золотых знака 3 3 серебряных знака 13 13 бронзовых знаков
Вообще, это c-style, в c++ лучше писать while(true)
11 янв 2012 в 13:49
Кстати, можно зациклить не только традиционным while(true) или for(;;), но и с использованием операторов continue или goto, только там кода побольше будет.
11 янв 2012 в 15:15
Как это с goto кода больше . L:; . goto L; Столько же букв, как и в while(1)< . >, вот for(;;) < . >на одну короче.
11 янв 2012 в 15:41
еще вариант — с помощью longjmp
11 янв 2012 в 16:08
4 ответа 4
Сортировка: Сброс на вариант по умолчанию
Это значит, что цикл бесконечный. Прервать его итерацию можно через break или return (ну или через throw).
Отслеживать
ответ дан 11 янв 2012 в 12:45
vladimir_ki vladimir_ki
1,923 10 10 серебряных знаков 12 12 бронзовых знаков
Ты ещё goto не назвал.
11 янв 2012 в 14:33
goto — не лучший способ. о нем и не знать не стыдно
11 янв 2012 в 15:55
не, о нем стыдно не знать. а использовать его еще стыднее.
11 янв 2012 в 15:59
Усвоил одно — как веганы рассказывают, что «можно обходиться без мяса» (или чем его заменить), так и некоторые камрады рассказывают про goto 🙂 А так да, злоупотреблять не надо)
11 янв 2012 в 19:10
Главное, почему не рекомендуют использовать goto, это трудность чтения таких программ, трудность их поддержки и возможность появление труднообнаружимых ошибок.
11 янв 2012 в 20:00
Общая форма цикла while имеет следующий вид:
while(условие) оператор; //(оператор это тело цикла)
Условие может быть любым допустимым выражение в языке. Функция проверяет на Истину или Ложь условие.
Если ИСТИНА то цикл продолжается (все что в теле цикла) — любое значение кроме 0.
Если ЛОЖЬ то цикл прекращается — 0.
В данном случае while(1) , while(5) , while(-15) истина — цикл продолжается бесконечно или пока в теле цикла не будет break , exit() , return или goto .
А while(0) уже ложь и цикл останавливается не начавшись.
Arduino.ru
Подскажите по следующему вопросу. Будет ли работать цикл while (1) в функции, которая вызывается из основной loop? Суть в следующем. Вызывается функция из loop, в этой функции организован цикл while (1), который должен ожидать нажатие кнопок и выбирать что делать дальше. Выход из while (1) происходит при нажатии на определенную кнопку что по идее должно вернуть управление основному циклу loop. Но почему-то не получается. Похоже что цикл while (1) просто игнорируется. Если в мою функцию (в которой есть цикл while (1)) добавить задержку, то видно, что сама функция вызывается, но цикл while (1) не обрабатывается, функция завершается без ожидания нажатия на кнопки и процесс возвращается обратно в loop.
while (1) вообще доложен работать в функциях или он только в loop работает?
- Войдите на сайт для отправки комментариев
Втр, 07/04/2015 — 00:45

Зарегистрирован: 06.07.2014
Ничего не могу сказать по поводу while (1) в среде Arduino IDE, но у Вас в корне неверный подход. Заставлять микроконтроллер впустую гонять цикл в ожидании нажатия кнопки без возможности выполнять другие задачи — это плохая практика. Используйте прерывания. Пусть лучше гоняет loop (), а в обработчике прерывания выполняйте нужные Вам действия или вызывайте другие функции. Если в обработчике прерывания будете менять значения каких-то переменных, не забудьте объявить их с квалификатором volatile.
- Войдите на сайт для отправки комментариев
Типы циклов в языках программирования: for, foreach, while и do while
Циклы — это основные управляющие конструкции в программировании. Они есть во всех современных языках. Рассказываем, какие бывают типы циклов.
В программировании различные типы циклов применяются для того, чтобы повторить некоторое действие нужное количество раз. Например отсортировать элементы массива или найти факториал числа. Цикл состоит из условия и тела цикла. Код, находящийся в теле, выполняется, когда условие равно true. Каждое повторение цикла называется итерацией.
Типы циклов
Цикл For
for (int i=0; i
i — это переменная-счётчик, которая сначала равна нулю. До тех пор, пока она меньше 10, выполняется тело цикла, затем счетчик увеличивается на единицу. For — цикл с предусловием. Это значит, что сначала проверяется условие, и если оно true, то тело выполняется. В скобках объявляется тип переменной счётчика и её начальное значение. Затем указывается условие конца цикла и способ, которым изменяется значение счётчика.
Цикл Foreach (или совместный цикл)
for (int element :array)
Тело этого цикла выполнится для каждого элемента коллекции. В переменной element будет доступен по очереди каждый элемент массива array.
Цикл While
while(i
Относится к тому же типу циклов, что и For, — цикл с предусловием. С его помощью можно создать безусловный цикл, например while(1) — бесконечный цикл. Чтобы его закончить, нужно использовать служебное слово break.
Цикл Do While
do < тело >while (i <10)
Do While относится к типу циклов с постусловием. Однако здесь код выполнится как минимум один раз, даже если условие false.
Вложенные циклы
int array[][] = , > for (i=0;i <3;i++) < for (j=0;j<3;j++) < printf(array[i][j]) >>
Циклы можно помещать внутрь друг друга. Это удобно для перебора многомерных коллекций. Код в примере выше выведет в консоль значение каждого элемента из двумерного массива array.
Операторы циклов
Break
while (true) // бесконечный цикл < std::cout > val; // Выходим из цикла, если пользователь ввел 0 if (val == 0) break; >
Оператор break используется для досрочного выхода из цикла. Когда программа встречает break, цикл немедленно завершается и начинает выполняться код, следующий за циклом.
Continue
Оператор Continue даёт циклу команду выйти из текущей итерации и перейти к следующей.
Этот код выведет в консоль все нечетные числа из диапазона от 0 до 10:
for (int i = 0; i < 10; i++) < if (i % 2 == 0) < continue; >cout