如何使用 && 评估这些 fork() 调用和|| C 中的运算符?
我下面有一些使用 fork()
系统调用的 C 代码,但我只是很困惑:我该怎么做
解决它的作用:
int main()
{
fork();
fork() || fork() && fork();
fork();
printf("ämit");
}
fork() &&叉() || fork();
的评估如下:
fork()
/ \
0/ \>0
|| fork() && fork()
/\ / \
/ \ 0/ \>0
* * || fork() *
/ \
* *
我需要相同类型的树 fork() || fork() && fork()。谁能告诉我应该如何实现它?
I have below some code in C which uses the fork()
system call, but I am just confused: how do I go about
solving what it does:
int main()
{
fork();
fork() || fork() && fork();
fork();
printf("ämit");
}
fork() && fork() || fork();
is evaluated some thing like this below:
fork()
/ \
0/ \>0
|| fork() && fork()
/\ / \
/ \ 0/ \>0
* * || fork() *
/ \
* *
I need same kind of tree for fork() || fork() && fork()
. Can anyone tell me how I should achieve it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果这是一个面试问题(可能)或家庭作业(可能性较小),您首先要冷静地解释您可以如何评估它。
我的意思是,您声明第一个、第二个和第五个分叉是无条件的,但第三个和第四个分叉取决于第二个和第三个(并且第二个和第三个分叉将在多个进程中发生)。
这将表明您理解这些概念。
然后你解释说这并不重要,因为如果任何编码器实际上向你提供了这样的代码,就会发生一些严重的焦油和羽毛行为。像这样的怪物代码在现实世界中没有立足之地,尽管它有助于测试您的理解,但您在现实中永远不会遇到它。
If this is an interview question (likely) or homework (slightly less likely), you first calmly explain how you could evaluate it.
By that I mean, you state that the first, second and fifth forks are unconditional but the third and fourth depend on the second and third (and that these second and third will be happening in multiple processes).
That will show that you understand the concepts.
Then you explain that it doesn't really matter because, if any coder actually handed you code like that, there'd be some serious tar'n'feather action going on. Code like this monstrosity has no place in the real world and, although it's good for testing your understanding, you'll never encounter it in reality.
||
的优先级低于&&
,并且如果第一个操作数包含足够的数据,这些运算符在评估第一个操作数后会短路 (||
如果第一个操作数为 true,则 code> 短路;如果第一个操作数为 false,则&&
短路)。fork()||fork()&&fork()
相当于fork() || ( fork() && fork() )
因此:
对于第一个示例,它相当于
( fork() && fork() ) || fork()。
||
has lower precedence than&&
, and those operators short-circuit after evaluation of the first operand if it contains sufficient data (||
short-circuits if first operand is true and&&
short-circuits if first operand is false).fork()||fork()&&fork()
is equivalent tofork() || ( fork() && fork() )
Therefore:
For you first example it was equivalent to
( fork() && fork() ) || fork()
.