如何理解if语句中的这种情况?

时间:2017-04-20 05:57:12

标签: c if-statement struct

以下代码是该计划的一部分。我不知道如何理解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;
}

2 个答案:

答案 0 :(得分:3)

首先,你需要知道什么是真正的值以及什么是C中的虚假值:

  • 零是一个假值,而非零是真的。
  • 对于指针,NULL是假的,而非NULL是真的。

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,条件将为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