if((pid1=fork())<0)和if(pid1=fork()<0)有什么区别么?!因为在Linux下这两个条件运行出的结果完全不同

2025年03月23日 08:46
有4个网友回答
网友(1):

C语言中的运算符是有优先级的。
赋值运算符“=”的级别最低。

fork()函数的返回值有三种情形:
负数:如果出错,则fork()返回-1,此时没有创建新的进程。最初的进程仍然运行。
零:在子进程中,fork()返回0
正数:在负进程中,fork()返回正的子进程的PID

if((pid1=fork())<0)的意思是:执行fork()创建进程,并把返回值赋给pid1;
(1)如果fork()返回负数,也就是创建进程失败,则表达式((pid1=fork())<0)为真,pid = -1,从而会执行后面的语句;
(2)如果返回值为正数或者0,也就是进程创建成功,pid1 >= 0,则不执行后边的语句。

if(pid1=fork()<0)的意思是:执行fork()创建进程,把逻辑表达式fork()<0的值赋给pid1,
(1)如果它的返回值为负数,也就是创建进程失败,则表达式(pid1=fork()<0)为真,pid1 = 1,从而会执行后面的语句;(在if语句中,应该不会直接用pid1作处理的,但else语句中,一般会对pid1进行判断,子进程和父进程分别进行不同的操作,但pid1已经不表示子进程号,从而出错。)
(2)如果fork()返回值为正数或者0,那么表达式为假,pid1 = 0,从而不会执行后边的语句。(此时,情况同上面讲的else分支的情况,即从逻辑上看认为已经创建子进程成功了,而pid1却不是表示子进程号,而是0,从而代码出现错误)

从上面的分析可以看出:
(1)fork()执行成功,则无论是子进程还是父进程都会执行If后面的语句;如果fork()执行失败,则原有进程都不会执行if后面的语句。所以,从逻辑分支的选择上看,二者是等效的。
(2)但pid1 的赋值不同。如果if后面的语句或者else后面的语句中,涉及到对pid1的处理,那么,处理结果大相径庭,就不难理解了啊。

网友(2):

等于号的优先级比小于号的要低。先执行<,再执行=.

网友(3):

运算符有一个优先顺序。。=与<。。所以运算的结果也就不一样了。

网友(4):

括号影响了,运算的优先级。所以结果不同。