Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
#1

Странное поведение bool - C++

13.02.2012, 20:48. Просмотров 1518. Ответов 23
Метки нет (Все метки)

Помогал отлаживать код и мы наткнулись на удивительное.

Кодер скрыл отображение варнингов в VS2010.
Метод М1 не всегда возвращал значение типа bool.
И потому в методе М2, вызывающем метод М1, случилась такая ситуация, что:
C++
1
M1()!=true & M1()!=false
Это нормальное поведение компилятора?
Логика то понятна, но почему это вообще варнинг, а не еррор как в си шарпе?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2012, 20:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странное поведение bool (C++):

Странное поведение указателя - C++
class XMLDocument { public: char *xml; XMLDocument() { }; void NewXML()

потокобезопасный bool (?) - C++
Является ли работа с обыкновенным bool потокобезопасной? Если нет, то можно пример, где что-то пойдет не так при работе с переменной типа...

конвертация строки TCHAR в BOOL ? - C++
Получаю параметр в виде строки &quot;TRUE&quot;\&quot;FALSE&quot; из ini, но ни как не получается его преобразовать в нормальный для переменной чекбокса вид....

Decltype поведение - C++
Добрый день :) вообщем вот такой вопрос читаю книгу и там есть такой пример int a = 10; decltype((a)) b;//тут мы получим ссылку потому...

"std::domain_error" в bool-функции - C++
Есть одна функция, которая сохраняет данные json в файл. Когда доходит дело до return, то срабатывает исключение &quot;std::domain_error&quot;. ...

Можно ли полагаться на поведение this->shared_from_this() - C++
добрый вечер. #include &lt;iostream&gt; #include &lt;memory&gt; struct sample: std::enable_shared_from_this&lt;sample&gt; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
13.02.2012, 20:52 #2
true это как бы значение 1, а false - это как бы значение 0. Если функция M1 заканчивается на "return 2;", то так и получится
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
13.02.2012, 20:53  [ТС] #3
там не было ретарна)
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,368
13.02.2012, 20:59 #4
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
Кодер скрыл отображение варнингов в VS2010.
Метод М1 не всегда возвращал значение типа bool.
И потому в методе М2, вызывающем метод М1, случилась такая ситуация.....
Код, иллюстрирующий "загадочное" поведение, - в студию!
Preveter
9 / 9 / 1
Регистрация: 11.08.2011
Сообщений: 66
13.02.2012, 21:00 #5
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
Это нормальное поведение компилятора?
С моей точки зрения, это нормально. И если М1 возвращает не bool, то проверять возвращаемое значение на false или true бессмысленно. Лучше тогда проверять на ==0 или !=0 (если конечно, опять же, это имеет смысл).
А из-за того, что компилятор считает, что ты лучше знаешь, что делаешь, он вместо ошибки выдает предупреждение.
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
13.02.2012, 21:06 #6
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
там не было ретарна)
Тогда тем более у тебя было возвращено неинициализированное значение
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
13.02.2012, 21:11  [ТС] #7
Сразу скажу это не оригинальный код.
+ бонус к загадке, только что вспомнил еще одну странность. тут уже логика моя сдает)

label1: и label2: только для наглядности.

Не по теме:

их нет и не было, это все ваше воображение)


1) label2: этого ретарна не было

2) label1: если раскоментить, то внешний цикл, работа которого зависит от возврата значения обрывался после первой итерации. если убрать работал как миленький на (M1()!=false) =)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
bool CLASS::M1(char **buf, const int bufsize)
{
    //fo - член класса
    int karetka =ftell(fo);
 
    //длина строки без сомволов \r\n, если они имеются
    int length=0;
 
    //чтение строки из файла до символа \n или EOF
    while((ch=fgetc(fo))!=EOF){
        if(ch=='\n')break;
        length++;
    }
 
    int slength=ftell(fo)-karetka;
    if(slength==0)
        return false;//файл кончился
    /*чтение строки без сомволов \r\n*/
    fseek(fo,-slength,SEEK_CUR);
    char *string = new char[length+1];
    string=fgets(string,length+1,fo);
    /**/
    //смещение на символы \r\n если они были
    fseek(fo,slength-length,SEEK_CUR);
 
    if(BasicAlgorythm(string))
    {
        for(int i=0;i<bufsize;i++)
        {
            (*buf)[i]=string[i];
        }
        (*buf)[bufsize-1]='\0';
    }
    else
    {
            (*buf)[0]='\0';
    }
    
label1: //delete[] string;
label2: //return true;
}
Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
Тогда тем более у тебя было возвращено неинициализированное значение
да, логично. Но почему оно != true и != false

И почему варнинг, которым многие пренебрегают, а не еррор??
Preveter
9 / 9 / 1
Регистрация: 11.08.2011
Сообщений: 66
13.02.2012, 21:12 #8
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
И почему варнинг
А что в нем написано?
gGrn-7DA
мну довольно <(-__-)l
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,392
Завершенные тесты: 1
13.02.2012, 21:14  [ТС] #9
Цитата Сообщение от Preveter Посмотреть сообщение
компилятор считает, что ты лучше знаешь

Не по теме:

где скачать компилятор, для тех кто учится?! Он многим бы помог обучающимся...=)



Добавлено через 1 минуту
Цитата Сообщение от Preveter Посмотреть сообщение
А что в нем написано?

Не по теме:

хз, не читал.

но не может так быть что варнинга даже не было?!
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
13.02.2012, 21:21 #10
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
Но почему оно != true и != false
Считай, что вместо false у тебя константа со значение 0, вместо true - константа со значением 1, вместо bool - int. Именно такой код построит компилятор

Цитата Сообщение от gGrn-7DA Посмотреть сообщение
И почему варнинг, которым многие пренебрегают, а не еррор??
Стандарт языка допускает отсутствие возвращаемого результата в не-void функциях. Почему - спроси у страуструпа
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
13.02.2012, 21:52 #11
Цитата Сообщение от Evg Посмотреть сообщение
Стандарт языка допускает отсутствие возвращаемого результата в не-void функциях. Почему - спроси у страуструпа
вернее он не запрещает отсутствие возвращаемого значения для всех возможных путей выполнения
C++
1
2
3
4
5
6
7
8
9
10
11
int f1()
{
   // noreturn - ошибка
}
 
int f2()
{
    if(condition)
        return 1;
    // (1) возврат значения не во всех путях иполнения. не запрещено
}
почему так? может потому, что вполне разумным может оказаться
C++
1
2
3
4
5
6
int f3()
{
    if(condition)
        return 1;
    exit(magic_number);
}
но в случае выполнения по пути (1) (в f2) имеем undefined behavior. значит вопрос почему
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
!= true и != false
не имеет смысла
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
13.02.2012, 22:03 #12
Цитата Сообщение от retmas Посмотреть сообщение
вернее он не запрещает отсутствие возвращаемого значения для всех возможных путей выполнения
Тонкостей стандарта я не знаю, но код

C++
1
2
3
4
int f1()
{
   // noreturn - ошибка
}
вполне себе компилируется на g++ и на borland'овском компиляторе
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
13.02.2012, 22:05 #13
Цитата Сообщение от Evg Посмотреть сообщение
вполне себе компилируется на g++ и на borland'овском компиляторе
это не стандартное поведение(по крайней мере для с++)
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
13.02.2012, 22:11 #14
А можешь выдержку из стандарта привести (если есть возможность)?
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
13.02.2012, 22:19 #15
да как раз только что нашел для С(правда драфт, но последний(April 12, 2011 ISO/IEC 9899:201x))
return without expression not permitted in function that returns a value (and vice versa)
сейчас ищу пруф для С++

Добавлено через 2 минуты
а вот из стандарта С++ (ISO/IEC 14882:2011 Third edition 2011-09-01)
6.6.3 The return statement
A return statement with neither an expression nor a braced-init-list can be used only in functions that do not return a value, that is, a function with the return type void, a constructor (12.1), or a destructor (12.4).
...
Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior
in a value-returning function.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2012, 22:19
Привет! Вот еще темы с ответами:

Странное поведение! - C++ Builder
Доброго времени суток! На лицо странное (на мой взгляд) поведение С++ Builder 6. Итак код: String TBlockScheme::FigureCode(TPoint...

Странное поведение UnicodeString. - C++ Builder
С некоторого момента UnicodeString без особых на то причин начала вести себя странно. Variang vstr = &quot;debug_1&quot;; UnicodeString ustr; ...

Странное поведение XE2 - C++ Builder
Как такое возможно(скриншот). И еще замечаю - не всегда происходит присваивание значений переменным.

Странное поведение - Java SE
Добрый день! Имеется класс с мейном: public class Main { // args - is path to file with first and last words // args -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.02.2012, 22:19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru