/ / Разлика между блок и в ред ако оператор - c ++

Разлика между блок и in-line if statement - c ++

В 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 в макросите? за трик на по-безопасни макроси.