Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
мну довольно <(-__-)l
214 / 203 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
1

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

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

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

Кодер скрыл отображение варнингов в VS2010.
Метод М1 не всегда возвращал значение типа bool.
И потому в методе М2, вызывающем метод М1, случилась такая ситуация, что:
C++
1
M1()!=true & M1()!=false
Это нормальное поведение компилятора?
Логика то понятна, но почему это вообще варнинг, а не еррор как в си шарпе?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2012, 20:48
Ответы с готовыми решениями:

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

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

Странное поведение Builder XE
Добрый день! При работе программы возникает ошибка типа acces violation в след куске кода: for...

Странное поведение UnicodeString.
С некоторого момента UnicodeString без особых на то причин начала вести себя странно. Variang...

23
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,449
Записей в блоге: 30
13.02.2012, 20:52 2
true это как бы значение 1, а false - это как бы значение 0. Если функция M1 заканчивается на "return 2;", то так и получится
0
мну довольно <(-__-)l
214 / 203 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
13.02.2012, 20:53  [ТС] 3
там не было ретарна)
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.02.2012, 20:59 4
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
Кодер скрыл отображение варнингов в VS2010.
Метод М1 не всегда возвращал значение типа bool.
И потому в методе М2, вызывающем метод М1, случилась такая ситуация.....
Код, иллюстрирующий "загадочное" поведение, - в студию!
0
9 / 9 / 2
Регистрация: 11.08.2011
Сообщений: 66
13.02.2012, 21:00 5
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
Это нормальное поведение компилятора?
С моей точки зрения, это нормально. И если М1 возвращает не bool, то проверять возвращаемое значение на false или true бессмысленно. Лучше тогда проверять на ==0 или !=0 (если конечно, опять же, это имеет смысл).
А из-за того, что компилятор считает, что ты лучше знаешь, что делаешь, он вместо ошибки выдает предупреждение.
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,449
Записей в блоге: 30
13.02.2012, 21:06 6
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
там не было ретарна)
Тогда тем более у тебя было возвращено неинициализированное значение
0
мну довольно <(-__-)l
214 / 203 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
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

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

Не по теме:

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



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

Не по теме:

хз, не читал.

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

Цитата Сообщение от gGrn-7DA Посмотреть сообщение
И почему варнинг, которым многие пренебрегают, а не еррор??
Стандарт языка допускает отсутствие возвращаемого результата в не-void функциях. Почему - спроси у страуструпа
1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
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
не имеет смысла
1
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,449
Записей в блоге: 30
13.02.2012, 22:03 12
Цитата Сообщение от retmas Посмотреть сообщение
вернее он не запрещает отсутствие возвращаемого значения для всех возможных путей выполнения
Тонкостей стандарта я не знаю, но код

C++
1
2
3
4
int f1()
{
   // noreturn - ошибка
}
вполне себе компилируется на g++ и на borland'овском компиляторе
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
13.02.2012, 22:05 13
Цитата Сообщение от Evg Посмотреть сообщение
вполне себе компилируется на g++ и на borland'овском компиляторе
это не стандартное поведение(по крайней мере для с++)
1
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,449
Записей в блоге: 30
13.02.2012, 22:11 14
А можешь выдержку из стандарта привести (если есть возможность)?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
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.
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,449
Записей в блоге: 30
13.02.2012, 22:20 16
Sun'овский компилятор (к которому на моей памяти ещё не было ни одной претензии по части поддержки стандарта) действительно запрещает это дело, а вариант, когда по одной ветке есть return, а по другой нету - нормально компилируется
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
13.02.2012, 22:23 17
Цитата Сообщение от Evg Посмотреть сообщение
Sun'овский компилятор (к которому на моей памяти ещё не было ни одной претензии по части поддержки стандарта) действительно запрещает это дело, а вариант, когда по одной ветке есть return, а по другой нету - нормально компилируется
как ни странно vs2010 имеет такое же поведение
0
Evg
Эксперт CАвтор FAQ
21118 / 8134 / 628
Регистрация: 30.03.2009
Сообщений: 22,449
Записей в блоге: 30
13.02.2012, 22:30 18
Цитата Сообщение от retmas Посмотреть сообщение
как ни странно vs2010 имеет такое же поведение
Я им не пользуюсь. У меня из виндузовых есть только borland
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
13.02.2012, 22:51 19
самое интересное, что согласно
Flowing off the end of a function is equivalent to a return with no value
C++
1
2
3
4
int f()
{
   // noreturn - ошибка
}
и
C++
1
2
3
4
int f()
{
   return;
}
одно и то же.
но в первом случае g++ выдает ворнинг, а во 2-м - ошибку. похоже это не просто не стандартное поведение(aka расширение), а баг. может стоит репортнуть(если не репортилось это ранее)?

Добавлено через 15 минут
gcc жрет оба варианта
0
Псевдослучайный
1934 / 1135 / 96
Регистрация: 13.09.2011
Сообщений: 3,204
13.02.2012, 22:57 20
retmas, свежий gcc(и g++) для целых ноль возвращает по умолчанию(для всех, не только main), причём некоторое время назад он так не делал, таки расширение
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.02.2012, 22:57

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

Странное поведение окон
Здравствуйте! Демка с комментами Суть. Мне нужно создать независимое окно с отдельной...

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

Classic Bluetooth странное поведение сокета
Доброго времени суток ! Пытаюсь подружить устройство на stm32+CH-06 с компом Использую...

Странное поведение char при выводе в Edit
void __fastcall TForm1::Edit2Change(TObject *Sender) { char s; AnsiString s1; if(Edit2-&gt;Text !=...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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