如果(!variable_name)在c语言中是什么意思
问题就在这里如果(!variable_name)在c语言中是什么意思,c,C,问题就在这里 int main() { int pid = fork(); if (!pid) { // condition 1 } else { // condition 2 } return 0; } (!pid)做什么 它相当于: if (!pid != 0) /* ... */ 然后: if (pid == 0) /* ... */ if(pid) C11(n1570),§6.5.3.3一元算术运算符 逻辑
int main() {
int pid = fork();
if (!pid) {
// condition 1
} else {
// condition 2
}
return 0;
}
(!pid)
做什么 它相当于:
if (!pid != 0) /* ... */
然后:
if (pid == 0) /* ... */
if(pid)
C11(n1570),§6.5.3.3一元算术运算符
逻辑求反运算符的结果如果其操作数的值比较,则代码>为0
不等于0,如果其操作数的值比较等于0,则为1。结果的类型为int
。
表达式!E
相当于(0==E)
虚假的东西:
false,0,null
真实的事情:
其他一切
如果!pid要为真,pid必须为0、false或null!如果pid
等于零,则pid
表达式将为真
基本上,这与:
if (pid == 0) {
}
这个-运算符否定逻辑条件 在C语言中,0的数值被视为逻辑假,任何其他数值都被视为逻辑真。这个-运算符否定逻辑条件,因此当pid为0时为真,当pid不为0时为假
您可以将其理解为“当没有pid时”。它的意思是否定。在您的情况下,
条件1
将在父进程中执行,条件2
将在子进程中执行。在纯旧C中,没有布尔数据类型,但有布尔逻辑
数值的计算结果均为true
,但0的计算结果为false
if(!pid)
这样做的结果是,如果要测试某个条件是否为真,实际上是将其与0进行比较
C中的比较运算符生成一个true
或false
结果,这意味着它们返回一个数字1或0
求反运算符将true
转换为false
if(!pid)
正如你所写:
if(pid == 0) {
/* do something */
}
然后:
if (pid == 0) /* ... */
if(pid)
是
(!pid)
相当于(pid==0)
实际上,问题中的代码被窃听了fork()
可以返回以下三项之一:
>0
子进程的进程id。这将返回给父级
0
这将返回给子级
我想所有贴出的答案都是正确的。在一行中,(!pid)将等于(pid==0)。
然而,我借此机会解释如何/为什么在这里使用它
函数将创建一个子进程,也称为子进程。因此,当函数返回时,在该实例中将有两个进程,它们在同一位置执行代码。因此,它将在流程的两个副本中返回-我们称之为父级和子级
fork()
的返回值是子进程在父进程中返回时的返回值在子进程中为=0。在代码中,pid=fork()代码>将捕获此返回值
若(pid==0),则您处于子进程中。如果(pid!=0)您在父进程中。根据您是在父级还是在子级中,可以更改代码的行为。(例如,您可以在child中调用exec,在parent中调用wait。)
有关fork函数的更多详细信息,请在谷歌上搜索fork()
,这应该在任何一个像样的C教程中提到……这不是“疑问”。这是个问题。唉。我知道这是徒劳的,但很难习惯这种用法@TimPost OP没有尽全力学好基本的C语法。他应该被弄糊涂,这里+1是个好答案。谢谢。所以它不是(!(pid!=0))就是(pid==0)…对@Lundin这样写的另一个原因是它可能更容易/更快阅读和解释。你可能会嘲笑这种类型的问题,但它确实会引发对良好编码实践的讨论。@Lundin好吧,我被说服了。(我认为您的意思是if(ptr==NULL | |*ptr==0)
尽管)+1,以说明它在本例中与线程相关的含义;i、 e.fork
保证返回0是父线程,而不是零是子线程。子线程中的条件1不是吗?@user1630845不是,0
因为pid指的是父进程。您的答案解释得足够了,但请您说得更清楚一点。@Roman您是对的,但它返回到了子进程。父进程还获取子进程的PID。如果我错了,请纠正我D