如何理解if语句中的这种情况?
问题描述:
下面的代码是程序的一部分。我不知道如何理解if(!conn)
和if(!conn->db)
。这不是一个明显的条件,我的意思是不像if(a==b)
。如何理解if语句中的这种情况?
然后任何人都可以帮我理解这种if statement
它是英文吗?预先感谢您的答案!所有的
struct Connection *Database_open(const char *filename, char mode)
{
struct Connection *conn = malloc(sizeof(struct Connection));
if(!conn)die("Memory error");
conn->db = malloc(sizeof(struct Database));
if(!conn->db) die("Memory error");
if(mode == 'c')
{
conn -> file = fopen(filename, "w");
}
else{
conn -> file = fopen(filename, "r+");
if(conn->file){
Database_load(conn);
}
}
if(!conn -> file) die("Failed to open the file");
return conn;
}
答
首先,你需要知道什么是truthy价值观和什么C是falsy值:
- 零是falsy值,而非零是truthy。
- For pointers,
NULL
is falsy while nonNULL
is truthy。
Truthy值的计算结果为true,而falsy计算结果为false。
配备此信息,请查看if(!conn)
。在这里,conn
是一个指针,而!
是反转其操作数的逻辑NOT运算符。所以,
- 如果
conn
是NULL
,!conn
将非NULL
和条件将是真实的。 - 如果
conn
为非NULL
,!conn
将为NULL
并且条件将为false。
因此,总之,它告诉程序die
,以防conn
的内存分配失败。
现在,让我们来看看if(!conn->db)
。在这里,conn
是一个指针,->
是箭头运算符,db
是conn
的成员之一,而!
是反转其操作数的逻辑NOT运算符。
现在,conn->db
获取成员变量db
的值。
- 如果
conn->db
是NULL
,!conn->db
将非NULL
和条件将是真实的。 - 如果
conn->db
是非NULL
,!conn->db
将是NULL
并且条件将是错误的。
因此,简而言之,它告诉程序die
的情况下,为conn->db
内存分配失败。
这两个条件是一样分别if(conn == NULL)
和if(conn->db == NULL)
,如通过@JonathanLefflerin the comments section
+0
谢谢你的回答。 – ComplicatedPhenomenon
- >是指定一个指针(指向一个对象),然后使用'。 '的运算符 –
'if(!conn-> db)'表示与if(conn-> db == 0)或if(conn-> db == NULL)相同。有些人喜欢速记;个人而言,我不会在我的代码中使用它。你还可以找到'if(conn-> db)',它相当于'if(conn-> db!= 0)'。它与'0'比较时可与任何数字或指针类型一起使用;如果你理智,你只能用NULL来比较指针。还要注意,在'f(!conn - > file)'中,箭头' - >'(或点'.')运算符的空格完全不合适。箭头和点运算符结合得非常紧密;不应该被空间包围。 –
'if(!conn)die ...'表示连接是否为假,然后死亡。这只是一个布尔条件。它仍然评估为真或假,只是写法不同而已。 –