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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> установки флагов формата, поразрядное сравнивание установок 
:(
    Опции темы
jurgal
Дата 1.8.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



небольшой отрывок функции:



Код

ios::fmtflags f;

f=cout.flags();

if(f & ios::skipws) cout << "skiws установлен\n";
else cout << "skipws сброшен\n";


присваиваем переменной f установки флагов формата, и теперь вопрос: оператор & сравнивает поразрядно операнды, но ведь в f все установки флагов, а сравниваем мы её только с skipws, как может получиться, что выражение (f & ios::skipws) даст нам истину?
PM MAIL   Вверх
Kuvaldis
Дата 1.8.2007, 16:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



jurgal, 
Цитата

ператор & сравнивает поразрядно операнды, но ведь в f все установки флагов, а сравниваем мы её только с skipws, как может получиться, что выражение (f & ios::skipws) даст нам истину?

Идет ПОРАЗРЯДНОЕ "и". В С/С++ любое (!) ненулевое значение - это истина
т.е. допустим, что 
flags    = 1111
skipws = 0010
после & получим:  0010 != 0   -> поэтому это истина


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
JackYF
Дата 1.8.2007, 18:02 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Kuvaldis истину глаголит. Поэтому ставь "&&" место "&".


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 2.8.2007, 10:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(JackYF @ 1.8.2007,  18:02)
Поэтому ставь "&&" место "&".

Проверка флагов осуществляется операцией побитной "И" (&), а не логической (&&)!!!
PM   Вверх
jurgal
  Дата 2.8.2007, 14:03 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



снова вопрос по флагам =)

когда использую функцию setiosflags(), то толку от неё нет никакого, т.е. ни ошибок при компилировании , ни каких либо изменений флагов на выводе: 

Код

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    cout << setiosflags(ios::hex);
    cout << setiosflags(ios::showbase);
    cout << 1100 << '\n';
    return 0;
}


результат получается: 1100, а когда меняю манипуляторы вот так:

Код

#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    cout << hex << showbase << 1100;

    return 0;
}


то все в порядке, получаю правильный результат. Где ошибка в использовании функции setiosflags()? 

Это сообщение отредактировал(а) jurgal - 2.8.2007, 14:04
PM MAIL   Вверх
bsa
Дата 2.8.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Мне тоже интересно. Думаю, проблема из той же серии, что и:
Код
std::cout << std::ios_base::hex << 100 << std::endl;
выводящее 8100, а не 64
PM   Вверх
korbian
Дата 2.8.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Делай так, и все ок
Код

std::cout << std::hex << 100 << std::endl;




Это сообщение отредактировал(а) korbian - 2.8.2007, 16:28


--------------------
korbian ©
PM   Вверх
jurgal
Дата 2.8.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в том то и дело, что если использовать манипуляторы так:

cout << hex << showbase << 100 << endl; 

то все в порядке, т.е. 64 - результат, а функцией setiosflags() пользоваться не получается, т.е. она не форматирует вводимое число, а оставляет как есть в десятичной системе и без указания системы счисления: 100
PM MAIL   Вверх
_stranger_
Дата 2.8.2007, 18:33 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а так все в порядке

Код

         std::cout << std::resetiosflags(std::ios_base::dec);
         std::cout << std::setiosflags(std::ios_base::hex);
         std::cout << std::setiosflags(std::ios_base::showbase);
         std::cout << 1100 << '\n';

видимо необходимо отчищать флаги...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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