В C ++ има ли разлика в кода на сглобяването, генериран от изявление като:
if (*expr*) { }
срещу.
if (*expr*) return;
Основно това, което искам да знам, е дали или не разграничаването на оператор if с квадратни скоби прави разлика в основния генериран код, отколкото просто декларация за връщане, както по-горе.
Отговори:
2 за отговор № 1Ако ще има само едно изявление в блока, тогава и двете ще бъдат идентични.
if (e)
{
stmt;
}
if (e) stmt;
са същите. Въпреки това, когато сте изпълнили повече от един оператор, е задължително да ги прехвърлите {}
.
1 за отговор № 2
Не, няма разлика между двата примера. Можете да използвате профилиращо устройство, за да видите кой асемблиращ код се извежда и вижте за себе си.
0 за отговор № 3
Освен от return
изявление, няма разлика.
Компилаторът може да оптимизира изцяло първия случай, ако изразът може да се прецени (напр. sizeof
) или няма странични ефекти.
По същия начин вторият случай може да бъде оптимизиран до просто return;
0 за отговор № 4
Тази функция…
void f1(int e) {
if (e) {}
}
… Компилира се до…
f1:
rep ret
… Докато тази функция…
void f2(int e) {
if (e) return;
}
… Компилира се до…
f2:
rep ret
… Когато оптимизацията е активирана с помощта на -O2
опция.
0 за отговор № 5
Ако има само едно изявление, тогава няма разлика в използването на "блок" и "писане на място".
Брекетите се използват само за да приложат поредица от твърдения, които са предназначени да бъдат разглеждани като един процес.
Общ синтаксис за if
:
if ( condition_in_the_diamond )
statement_to_execute_if_condition_is_true;
За да направим няколко реда код като един процес, ние използваме скоби.
Следователно, ако имате само едно изявление за изпълнение в оператор if, то ще бъде подобно.
Използването на скоби е по-добро, защото намалява вероятността от грешка. Да предположим, че коментирате ред от код в бързаме, за да отстраните грешки:
if(condition)
// statement1;
statement2; //this will bring statement2 in if clause which was not intended
или докато добавяте ред от код:
if(condition)
statement1;
statement3; // won"t be included in if
statement2;
Но ако използвате вградено изявление като:
if(condition) statement1;
тогава може да ви попречи на грешка, но ще го направи statement1
с ограничена дължина (при условие, че има код с ширина от 80 знака). Това ще го направи сладък и лесен за четене.
Следователно, ако не използвате инлайн изявление, се препоръчва използването на скоби.
0 за отговор № 6
С лошо написани макроси могат да се случат лоши неща.
// c-style antipattern. Better use scoped_ptr
#define CLEANUPANDRETURN delete p; return
if (*expr*) CLEANUPANDRETURN;
// preprocesses to: (with added linebreaks)
if (*expr*)
delete p;
return;
Много функции на C-библиотеката всъщност могат да бъдат макроси. виждам Защо да се използват очевидно безсмислени оператори do-while и if-else в макросите? за трик на по-безопасни макроси.