Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果(!variable_name)在c语言中是什么意思_C - Fatal编程技术网

如果(!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