我目前正在开发闪存卡项目,我需要检查文件的第一行以确保它是正确的类型,但在其他行上使用相同的功能会提出一个问题。我知道在一些编译器中这会起作用,但我不确定。例如:
if(line == 1 && execLine(line));
是否可以安全地假设如果行不是1,它甚至不会尝试execLine?
答案 0 :(得分:2)
在没有运算符重载的情况下,可以安全地假设如果行不是1,则不会对execLine进行求值。
if()
是多余的。 line == 1 && execLine(line)
就足够了。
答案 1 :(得分:1)
内置的中缀布尔运算符&&
和||
保证了短路行为,但用户定义的运算符重载却没有。
假设execLine
返回bool
,而不是存在用户定义的&&
重载的某种类型,
if( line == 1 && execLine( line ) );
......保证。
声明在几个方面是不合适的,所以让我们剖析它。
首先,带有空内部语句的控制语句最好用包含单个分号的花括号块表示,因为它会在视觉上显示它是空的
if( line == 1 && execLine( line ) ) {;}
但if
在这里完全是多余的,所以更好:
line == 1 && execLine( line );
从这里我们可以从两个不同的方向前进。如果我们想要保留这个形式,我们将解决编译器发出的可能而且不太可能的愚蠢警告,通过强制转换为void
,这是这个特殊演员的主要目的:告诉编译器,有意丢弃结果值。
(void)( line == 1 && execLine( line ) );
但是人们应该意识到这只是伪装的if
。它不是原始if
,而是if
:
if( line == 1 ) { execLine( line ); }