LINUX.ORG.RU

G++. Вычисление логических выражений


0

0


extern QPixmap* pix;
extern int w, h;
pix = 0;
...
if( pix && (pix->width() != w || pix->height()->h ) )
delete pix;


судя то тому, что происходит в gdb, несмотря на то, что pix равен нулю,
вычисляется еще и правый операнд оператора &&. Вроде бы Бьярн Мертвый Страус торжественно клялся, что такого небывает...

anonymous
Ответ на: комментарий от anonymous

Ничего я не путаю, я же тоже говорю, что небывает. Баг g++?

anonymous
()

>Вроде бы Бьярн Мертвый Страус торжественно клялся, что такого небывает... 

где???можно ссылку?? а вообще помоемому ето зависит от реализации и никто никого никчему не обязывает

лично я всегда пишу так:

if(pix) if( pix->width()!= w   ||   pix->height()->h ){
...
}

cvv ★★★★★
()
Ответ на: комментарий от cvv

> а вообще помоемому ето зависит от реализации и никто никого никчему не обязывает

Ну не знаю как в C++, а в C это обязательное требование. Думаю всё-таки что и в C++ тоже.

Teak ★★★★★
()
Ответ на: комментарий от cvv

>где???можно ссылку?? а вообще помоемому ето зависит от реализации и никто >никого никчему не обязывает

обязывает, купи книжку Страуструпа, да и книжка по C тоже не помешает

>лично я всегда пишу так

ну и дурак, в любой книжке по правильному написанию программ пишут что делать так не надо

anonymous
()

$ cat test.cpp
#include <cstdio>

int a(void)
{
printf("Call a\n");
return 0;
}
int b(void)
{
printf("Call b\n");
return 1;
}
int main()
{
if (a() && b())
printf("Hellow!!!\n");
return 0;
}
$ g++ test.cpp && ./a.out
Call a

anonymous
()
Ответ на: комментарий от anonymous

>Что за фигня?

Очепятка, читай: pix->height() != h

anonymous
()
Ответ на: комментарий от Teak

>Напиши лучше if( pix != NULL && (...) ) У меня первая мысль такая и была, угадайте, помогло или нет?

anonymous
()
Ответ на: комментарий от cvv

to cvv

> где???можно ссылку??

Бьерн Страуструп "Язык программирования С++" Третье издание. БИНОМ 1999.

глава 6.3.2. Инструкции выбора.

страница 176

> лично я всегда пишу так:

и в этом ты не прав

теперь по делу: из выше указанного источника. Операторы && и || вычисляют второй аргумент, только если в этом есть необходимость. Напрмер:

if (p && 1<p->count)...............

Whaler
()

Что все говорят о компиляторе?
То что && обязывает - ясно.
Однако проблема может быть и в gdb.
Пару недель назад помогал обойти очень похожую ситуацию, в стиле:
aaa = aaa->fff;
if (aaa!=NULL && aaa->f == 2) {
aaa->zzz=7;
gdb упорно показывал, что присваивание в строке с zzz происходит некорректно из-за равенства aaa нулю.
Т.е. ситуация почти идентичная - психоз.
Тривиальный анализ ассемблера показал что if вообще не выполнялся
и ошибка происходит реально на строке перед ним из-за того же
равенства нулю aaa, но до присваивания.
Иногда gdb категорически промазывает, бывает из-за спец-символов
(типа "новая страница"), бывает и просто так.
Проверьте не стоит ли любой ключ оптимизации вместе с отладкой.
Хотя и при отсутствии бывают фифекты.

io ★★
()
Ответ на: комментарий от io

ключи самые банальные: -pipe -O0 -ggdb

А перед этим вылетать прогамме просто негде, да после тоже.

anonymous
()

Кстати, вопрос к знатокам. Что говорит стандарт по поводу например такого кода:
void f( int a ) {
a || printf( "%s\n", "hello, world" );
}

anonymous
()

i chto vuchislilosj ? :) U tebyazh pix ni na chto ne ukazuvaet

aton
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.