块和内联if语句之间的区别

时间:2015-07-08 06:47:49

标签: c++

在C ++中,由语句生成的汇编代码有任何不同,例如:

var hRight = $('.right').height();
$('.left').height(hRight);

VS。

if (*expr*) { }

基本上我想知道的是,用括号分隔if语句是否与生成的底层代码相比,与简单的return语句有任何不同,如上所述。

6 个答案:

答案 0 :(得分:2)

如果块内只有一个语句,则两者都是相同的。

if (e)
{
   stmt;
}

if (e) stmt;

是一样的。但是,当您要执行多个语句时,必须将它们包装在{}中。

答案 1 :(得分:1)

不,这两个例子没有区别。您可以使用分析器查看输出的汇编代码,并亲自查看。

答案 2 :(得分:0)

return声明外,没有任何区别。

如果表达式是编译时可评估的(例如sizeof)或者没有副作用,编译器可以完全优化第一种情况。

同样,第二种情况可能会优化为简单的return;

答案 3 :(得分:0)

这个功能......

void f1(int e) {
    if (e) {}
}

...编译成......

f1:
    rep ret

......虽然这个功能......

void f2(int e) {
    if (e) return;
}

...编译成......

f2:
    rep ret

...使用-O2选项启用优化时。

答案 4 :(得分:0)

如果只有一个陈述,那么使用“block”和“write inline”没有区别。

大括号仅用于包含一系列旨在被视为单个进程的语句。

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个字符宽度代码)。这将使它看起来既简单又简单。

因此,除非您使用内联语句,否则建议使用大括号。

Source

答案 5 :(得分:0)

编写糟糕的宏可能会发生令人讨厌的事情。

// 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-Library的许多功能实际上可能是宏。看到 Why use apparently meaningless do-while and if-else statements in macros?以某种方式更安全的宏。