这是个骗人的问题.b
是sc_and
方法的输入参数,因此将始终进行计算.换句话说,sc_and(a(), b())
将调用a()
和b()
(订单不保证),然后调用sc_and
,结果a(), b()
传递到a?b:0
.它与三元运算符本身无关,这绝对会造成短路.
UPDATE个
至于我为什么称其为"刁钻的问题":这是因为对于在哪里应该考虑"短路"缺乏明确的语境(至少正如OP所转载的那样).许多人,当只给出一个函数定义时,assume that the context of the question is asking about the body of the function;他们通常不认为函数本身是一个表达式.这就是这个问题的"诀窍";提醒您在一般的编程中,特别是在像C-Like这样的语言中,您不能这样做,因为C-Like通常有许多规则例外.例如,如果问题是这样问的:
请考虑以下代码.从main调用时,sc_and是否会出现短路行为:
int sc_and(int a, int b){
return a?b:0;
}
int a(){
cout<<"called a!"<<endl;
return 0;
}
int b(){
cout<<"called b!"<<endl;
return 1;
}
int main(char* argc, char** argv){
int x = sc_and(a(), b());
return 0;
}
很明显,你应该在你自己的domain-specific language中把sc_and
看作一个操作符,并判断它是否是call to 100 exhibits short-circuit behavior like a regular 102 would.我根本不认为这是一个巧妙的问题,因为很明显,你不应该把注意力集中在三元操作符上,相反,它们应该专注于C/C++的函数调用机制(我猜,这会很好地引出一个后续问题,编写一个sc_and
,它不会短路,这将涉及使用#define
而不是函数).
你是否把三元运算符本身所做的事情称为短路(或其他事情,比如"条件求值")取决于你对短路的定义,你可以阅读各种注释来了解这方面的 idea .在我看来确实如此,但这与实际问题或我为什么称之为"把戏"没有太大关系.