是的,这是一个家庭作业(job)问题,但我已经做了研究,并对这个话题进行了大量深入思考,但我无法解决这个问题.问题指出这段代码没有显示short-circuit behavior,并询问原因.但在我看来,它确实表现出短路行为,所以有人能解释为什么它没有短路行为吗?

在C中:

int sc_and(int a, int b) {
    return a ? b : 0;
}

在我看来,在a为假的情况下,程序根本不会try 判断b,但我肯定是错的.在这种情况下,为什么程序甚至会触碰b,而不是必须触碰?

推荐答案

这是个骗人的问题.bsc_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 .在我看来确实如此,但这与实际问题或我为什么称之为"把戏"没有太大关系.

C++相关问答推荐

从STdin读写超过4096个字节

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

为什么下面的递归基本情况在C中不起作用?

如何在C宏中确定Windows主目录?

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

如何在C中使printf不刷新标准输出?

FRIDA-服务器成为端口扫描的目标?

在编写代码时,Clion比vscode有更多的问题指示器

接受任何参数的函数指针是否与接受不同参数的函数兼容

获取前2个连续1比特的索引的有效方法

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

Wcstok导致分段故障

为什么我的二叉树删除删除整个左部分的树?

如何在Rust中处理C的longjmp情况?

execve 不给出which命令的输出

使用共享变量同步多线程 C 中的函数

为什么需要struct in_addr

在带中断的循环缓冲区中使用 易失性

当循环变量在溢出时未定义时,可以进行哪些优化?

如何在 C 中编辑 struct 体中的多个变量