以下代码是该计划的一部分。我不知道如何理解if(!conn)
和if(!conn->db)
。这不是一个明显的条件,我的意思是不喜欢if(a==b)
。
然后任何人都可以帮助我用英语理解这种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;
}
答案 0 :(得分:3)
首先,你需要知道什么是真正的值以及什么是C中的虚假值:
NULL
是假的,而非NULL
是真的。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
,条件将为false。因此,简而言之,如果die
的内存分配失败,它会告诉程序conn->db
。
这两个条件分别与@JonathanLeffler in the comments section
提到的if(conn == NULL)
和if(conn->db == NULL)
相同
答案 1 :(得分:0)
逻辑就像Cool Guy所说的那样 - 对零进行检查(NULL也为0)。 您可以在上面阅读更多相关信息: http://en.cppreference.com/w/c/language/if