2017-04-20 99 views
-1

下面的代码是程序的一部分。我不知道如何理解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; 
} 
+0

- >是指定一个指针(指向一个对象),然后使用'。 '的运算符 –

+4

'if(!conn-> db)'表示与if(conn-> db == 0)或if(conn-> db == NULL)相同。有些人喜欢速记;个人而言,我不会在我的代码中使用它。你还可以找到'if(conn-> db)',它相当于'if(conn-> db!= 0)'。它与'0'比较时可与任何数字或指针类型一起使用;如果你理智,你只能用NULL来比较指针。还要注意,在'f(!conn - > file)'中,箭头' - >'(或点'.')运算符的空格完全不合适。箭头和点运算符结合得非常紧密;不应该被空间包围。 –

+2

'if(!conn)die ...'表示连接是否为假,然后死亡。这只是一个布尔条件。它仍然评估为真或假,只是写法不同而已。 –

回答

3

首先,你需要知道什么是truthy价值观和什么C是falsy值:

  • 零是falsy值,而非零是truthy。
  • For pointers,NULL is falsy while non NULL is truthy。

Truthy值的计算结果为true,而falsy计算结果为false。


配备此信息,请查看if(!conn)。在这里,conn是一个指针,而!是反转其操作数的逻辑NOT运算符。所以,

  • 如果connNULL!conn将非NULL和条件将是真实的。
  • 如果conn为非NULL!conn将为NULL并且条件将为false。

因此,总之,它告诉程序die,以防conn的内存分配失败。


现在,让我们来看看if(!conn->db)。在这里,conn是一个指针,->是箭头运算符,dbconn的成员之一,而!是反转其操作数的逻辑NOT运算符。

现在,conn->db获取成员变量db的值。

  • 如果conn->dbNULL!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