Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неявное завершение цикла? 
V
    Опции темы
hoz
Дата 15.2.2014, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



 Читаю книгу, и там попалось 2 кода, в которых используется приём, который я ранее не встречал, а точнее, касательно, того что, не указывается явное окончание цикла.
Вот первый пример:
Код

#include <iostream>
#include <cctype>
using namespace std;

int main()
{
   char *p;
   char str[80] = "This Is A Test"

   p = str;
   while(*p)
   {
      // КОД..
      //.. ВНУТРИ ОПЕРАТОРА
      P++;
   }

   return 0;
}

Вот второй пример:
Код

#include <iostream>
#include <cctype>
using namespace std;

int main()
{
   int i;
   char str[80] = "This Is A Test"

   for(i=0; str[i]; i++)
   {
      // КОД..
      //.. ВНУТРИ ОПЕРАТОРА
   }

   return 0;
}

В обоих случая, не указано, до какого момента продолжается цикл.
Касательно первого кода, автор книги пишит, что когда p укажет на завершающй нуль массива.
А, касательно, второго кода, автор пишит, что цикл продолжается, до тех пор, пока не "упрётся" в завершающий ноль массива str.
Откуда такие сведения? Я до этого не встречал в книгах подобных приёмов.
Под "нулём" понимается, как я понимаю, не сам 0 как число, а "пустое значение", верно?
PM MAIL   Вверх
Фантом
Дата 15.2.2014, 20:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Цитата(hoz @  15.2.2014,  21:01 Найти цитируемый пост)

Под "нулём" понимается, как я понимаю, не сам 0 как число, а "пустое значение", верно? 

Нет, именно 0 как число. Фокус в том, что в C есть возможность пользоваться неявными преобразованиями типов (или, что точнее, само понятие типа достаточно размыто), поэтому символ с нулевым кодом, которым завершается строка, может быть проинтерпретирован и как число 0, и как логическое значение "ложь".

Добавлено через 2 минуты и 10 секунд
Другое дело, что не встречали - и слава богам. При сколько-нибудь пристойном в смысле оптимизации компиляторе такие "изыски" ничего не дают в плане экономии ресурсов, но достаточно заметно осложняют понимание кода. Так что понимать, что тут происходит, полезно, но вот самому так писать не стоит.
PM   Вверх
hoz
Дата 15.2.2014, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(Фантом @  15.2.2014,  20:11 Найти цитируемый пост)
Нет, именно 0 как число. Фокус в том, что в C есть возможность пользоваться неявными преобразованиями типов (или, что точнее, само понятие типа достаточно размыто), поэтому символ с нулевым кодом, которым завершается строка, может быть проинтерпретирован и как число 0, и как логическое значение "ложь".

Получается, что данный приём используется разве что в строковых и символьных типах (string и char).  Закончилась строка... символа нет.. значит 0 т.е. СИМВОЛ ЕСТЬ == FALSE.
Больше, как я понимаю, к других типам данных подход не применим? Ну или ещё теоритически диапазон значений любого типа, но такое я не представляю где применить..


Цитата(Фантом @  15.2.2014,  20:11 Найти цитируемый пост)
Другое дело, что не встречали - и слава богам. При сколько-нибудь пристойном в смысле оптимизации компиляторе такие "изыски" ничего не дают в плане экономии ресурсов, но достаточно заметно осложняют понимание кода. Так что понимать, что тут происходит, полезно, но вот самому так писать не стоит.

Благодарю, учту, разумеется.

Это сообщение отредактировал(а) hoz - 15.2.2014, 20:32
PM MAIL   Вверх
Фантом
Дата 15.2.2014, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Цитата(hoz @  15.2.2014,  21:25 Найти цитируемый пост)

Получается, что данный приём используется разве что в строковых и символьных типах (string и char).  Закончилась строка... символа нет.. значит 0 т.е. СИМВОЛ ЕСТЬ == FALSE.

Символ как раз есть, просто его код равен нулю.

А так - да, как правило, такие штуки используются именно для перебора строк.
PM   Вверх
feodorv
Дата 16.2.2014, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(hoz @  15.2.2014,  21:25 Найти цитируемый пост)
Больше, как я понимаю, к других типам данных подход не применим? Ну или ещё теоритически диапазон значений любого типа, но такое я не представляю где применить..

Почему?
Код
char *strings[] = 
{
 "aaa", 
 "bbb",
  ...
  NULL
};

   for(i=0; strings[i]; i++)
   {
      // КОД..
      //.. ВНУТРИ ОПЕРАТОРА
   }



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
vinter
Дата 16.2.2014, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



hoz, всё, что является нулём преобразуется в false, всё остальное - true. 


--------------------
Мой блог
PM MAIL WWW   Вверх
SVN74
Дата 24.2.2014, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



В подобных выражениях желательно дополнительно проверять на TRUE для надежности... 

Это сообщение отредактировал(а) SVN74 - 24.2.2014, 18:43
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.