Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Стандарт С++ не гарантирует, что float(0) и даже int(0) реализуются как «все биты 0»Тем не менее стандарт гарантирует, что при приведении float(0) или int(0) к bool мы получим true.
// ПЛОХО
if (float_num) {}
if (int_num) {}я бы исключил из статьи.при приведении float(0) или int(0) к bool мы получим truefalse конечно же, опечатался.
Во-первых, он сразу проверяет тип, чем помогает не совершать ошибки.Если вы проверяете на равенство/неравенство нулю, то тип вам не важен, я думаю.
Во-вторых, использовать не bool просто не концептуально.Условие в if и while приводится к bool, если оно не bool. Писать if (x) вместо if (0 != x) это уже идиома. Чтобы поддержать эту идиому в классах определяется operator bool и operator!
boost::shared_ptr<T> p;
if (p) { ... }
if (NULL != p.get()) { ... }static inline bool fuzzyCompare1(float p1, float p2)
{
return abs(p1 - p2) <= 1.0E-4;
}static inline bool fuzzyCompare2(float p1, float p2)
{
return abs(p1 - p2) <= 0.00001f * min(abs(p1), abs(p2));
}Чтобы компилятор сразу же дёрнул вас за руку, некоторые люди вырабатывают привычку писать сравнения наоборот (признаюсь, я не смог её выработать в себе :-))Прийдется выработать привычку ставить максимальный уровень предупреждений и трактовать их как ошибки ;)
void f()
{
if(ok1)
{
do1();
if(ok2)
{
// а вот тут собственно код вашей фукнции - уже третий уровень вложенности
}
else
return -2;
}
else
return -1;
}
void f()
{
// проверим все условия
if(!ok1)
return -1;
do1();
if(!ok2)
return -2;
// теперь все гарантированно хорошо, можно сделать то что мы намеревались
// и никаких лишних {} и отступов
}void f()
{
// проверим все условия
if(!ok1) return -1;
do1();
if(!ok2) return -2;
// теперь все гарантированно хорошо, можно сделать то что мы намеревались
// и никаких лишних {} и отступов
}node *sum(p,q) /* compute the sum of two binary trees */
node *p,*q;
{
register node *pl,*ql;
register int s;
easy=1;
if (!p) return q;
if (!q) return p;
pl=left(p); ql=left(q);
s=compare(pl,ql);
if (s==0) {
@<Add |right(p)| to |right(q)| and append this to |succ(pl)|@>@;
easy=0;@+return p;
} else {
if (s<0) @<Swap |p| and |q| so that |p>q|@>;
q=sum(right(p),q);
if (easy) goto no_sweat;
else {
ql=left(q);
s=compare(pl,ql); /* does a carry need to be propagated? */
if (s==0) { /* yup */
change(&p->r,right(q));
recycle(ql);@+free_node(q);
if (pl) succ(pl);
else change(&p->l,get_avail());
return p;
}
else easy=1; /* nope */
}
no_sweat: change(&p->r,q);
return p;
}
}Например, мне проще выносить негатив в if, а обработку в else.
if( что-то-длинное
&& что-то длинное
&& что-то длинное )
if( что-то-длинное &&
что-то-длинное &&
что-то-длинное )
// СОВСЕМ ПЛОХО
if (cond()) act();
else err();
if (cond()) act();
else err();Это сбережёт процессорное время, память… в общем всё, что так дорого каждому человеку, исповедующему гуманистические идеалы :-)
// ПЛОХО
SomeClass p; // нужен только в блоке
if (x == y) {
p.moveTo(x, y);
p.logResultsOfMovement();
}// ОЧЕНЬ МИЛО
bool isInside = figureX > leftLimit && figureX < fightLimit;
bool isGreen = figureColor == GREEN;
if (isInside && isGreen) {
}if(someCheck())
{
}
bool isGreen = someCheck();
if(isGreen)
{
} нет, что может быть важно, если someCheck возвращает другой результат при повторном вызове.if (a == b)
{
foo();
}
else
{
bar();
} неприлично? Никак не могу привыкнуть писать «по стандарту», т.е. скобку сразу после if…bool operator ==(const A& a, const B& b)
{
// Implementation
}
bool operator==(const B& b, const A& a)
{
return a == b;
}A::A(const B&) либо A::operator B(). В первом случае вам нужен bool operator==(const A&, const A&), во втором bool operator==(const B&, const B&), которые и так будут реализованы.Paul@paulcomp /cygdrive/d/src/cpp/benchmarks $ g++-4 --version g++-4 (GCC) 4.3.2 20080827 (alpha-testing) 1 Copyright © 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Paul@paulcomp /cygdrive/d/src/cpp/benchmarks $ g++-4 -O2 -o test test.cpp Paul@paulcomp /cygdrive/d/src/cpp/benchmarks $ time ./test.exe 1 real 0m6.816s user 0m6.625s sys 0m0.015s Paul@paulcomp /cygdrive/d/src/cpp/benchmarks $ time ./test.exe real 0m0.733s user 0m0.656s sys 0m0.015s
Всё ли вы знаете про if?