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

C++

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

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

13.02.2012, 20:48. Просмотров 1501. Ответов 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++ Builder
Доброго времени суток! На лицо странное (на мой взгляд) поведение С++ Builder 6. Итак код: String TBlockScheme::FigureCode(TPoint...

Странное поведение - C++ WinAPI
#include &lt;windows.h&gt; LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance,...

Странное поведение компилятора - C++
Всем привет! Я конечно понимаю что нужно выкладывать минимальный код повторяющий мою проблему но он будет достаточно грамосток т.к. в...

Странное поведение программы - C++
Перечитываю Герберт Шилдт: С++ базовый курс. Простая программа: #include &lt;iostream&gt; using namespace std; int main() { ...

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

Странное поведение окон - C++ Builder
Здравствуйте! Демка с комментами Суть. Мне нужно создать независимое окно с отдельной кнопкой в таскбаре, для этого...

Странное поведение string - C++
Здравствуйте. Сейчас я пытаюсь скомпилировать под Windows проект, который ранее писался под Linux. Делаю я это с помощью MinGW от...

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

Не по теме:

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



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

Не по теме:

хз, не читал.

но не может так быть что варнинга даже не было?!
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,636
Записей в блоге: 26
13.02.2012, 21:21     Странное поведение bool #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     Странное поведение bool #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
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,636
Записей в блоге: 26
13.02.2012, 22:03     Странное поведение bool #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     Странное поведение bool #13
Цитата Сообщение от Evg Посмотреть сообщение
вполне себе компилируется на g++ и на borland'овском компиляторе
это не стандартное поведение(по крайней мере для с++)
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,636
Записей в блоге: 26
13.02.2012, 22:11     Странное поведение bool #14
А можешь выдержку из стандарта привести (если есть возможность)?
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
13.02.2012, 22:19     Странное поведение bool #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.
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,636
Записей в блоге: 26
13.02.2012, 22:20     Странное поведение bool #16
Sun'овский компилятор (к которому на моей памяти ещё не было ни одной претензии по части поддержки стандарта) действительно запрещает это дело, а вариант, когда по одной ветке есть return, а по другой нету - нормально компилируется
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
13.02.2012, 22:23     Странное поведение bool #17
Цитата Сообщение от Evg Посмотреть сообщение
Sun'овский компилятор (к которому на моей памяти ещё не было ни одной претензии по части поддержки стандарта) действительно запрещает это дело, а вариант, когда по одной ветке есть return, а по другой нету - нормально компилируется
как ни странно vs2010 имеет такое же поведение
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,636
Записей в блоге: 26
13.02.2012, 22:30     Странное поведение bool #18
Цитата Сообщение от retmas Посмотреть сообщение
как ни странно vs2010 имеет такое же поведение
Я им не пользуюсь. У меня из виндузовых есть только borland
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
13.02.2012, 22:51     Странное поведение bool #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 жрет оба варианта
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2012, 22:57     Странное поведение bool
Еще ссылки по теме:

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

Странное поведение строки - C++
Есть класс со связным списком(в связных списках символы)(файл1). Перегружаю оператор сложения для объектов этих классов так, чтобы оператор...

Странное поведение транслятора - C++
В следуюшем примере код компилируется нормально, но объект класса b не содается (пробывал на Visual studio 10 и на Borland builder 5), что...

Странное поведение указателей - C++
Здравствуйте, может кто-нибудь объяснить столь странное поведение указателя. Вот код. int main() { const int Width = 3; ...

Странное поведение присваивания - C++
class Lexem { public: uint id; uint value; uint line; uint pos; bool operator==(int a){ return a...


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

Или воспользуйтесь поиском по форуму:
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,115
13.02.2012, 22:57     Странное поведение bool #20
retmas, свежий gcc(и g++) для целых ноль возвращает по умолчанию(для всех, не только main), причём некоторое время назад он так не делал, таки расширение
Yandex
Объявления
13.02.2012, 22:57     Странное поведение bool
Ответ Создать тему
Опции темы

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