Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
C &引用;如果;及#“如果”;;哪一个更好用_C_If Statement - Fatal编程技术网

C &引用;如果;及#“如果”;;哪一个更好用

C &引用;如果;及#“如果”;;哪一个更好用,c,if-statement,C,If Statement,我了解到,if或#if都可以用于条件检查。 既然我们可以使用if检查条件,为什么要使用预处理器#if 如果我使用#if而不是if,会对我的代码产生什么影响 哪一个更好使用以及为什么?我们不能说哪一个更好使用,因为一个用于编译阶段(#if),另一个用于运行阶段(if) 尝试使用gcc-E构建上述代码,您将看到编译器将生成另一个仅包含以下内容的代码: printf("this code will be build\n"); 另一个printf将不会出现在新代码(预处理器代码)中,也不会出现在程序二

我了解到,
if
#if
都可以用于条件检查。 既然我们可以使用
if
检查条件,为什么要使用预处理器
#if

如果我使用
#if
而不是
if
,会对我的代码产生什么影响


哪一个更好使用以及为什么?

我们不能说哪一个更好使用,因为一个用于编译阶段(
#if
),另一个用于运行阶段(
if

尝试使用
gcc-E
构建上述代码,您将看到编译器将生成另一个仅包含以下内容的代码:

printf("this code will be build\n");
另一个printf将不会出现在新代码(预处理器代码)中,也不会出现在程序二进制文件中

结论:编译阶段处理
#if
,但在程序运行时处理正常的
if

您可以在代码的一部分中使用
#if 0
,以避免编译器编译它。就像你评论过这部分一样

范例

int main(void) {

       printf("this code will be build\n");
#if 0
       printf("this code will not\n");
#endif

}
相当于

int main(void) {

       printf("this code will be built\n");
/*
       printf("this code will not\n");
*/

}
if
#if
是不同目的的不同事物

如果使用
If
语句,则会在运行时计算条件,并且编译程序中存在两个分支的代码。条件可以基于运行时信息,例如变量的状态<代码>如果用于程序中的标准流量控制

如果使用预处理器的
#If
,则在编译时对条件进行评估(最初是在编译时之前,但现在预处理器通常是编译器的一部分),编译程序中不包含假分支的代码。该条件只能基于编译时信息(例如
#define
常量等)
#if
用于在不同的编译时环境中使用不同的代码(例如,在Windows上编译的代码与在*nix上编译的代码不同,诸如此类)。

当编译时已知条件的结果时,应使用#if;当直到运行时才知道结果时,应使用正则if

#if DEBUG
我知道在编译时我正在进行调试构建

if (date == DateTime.Today)

取决于今天是哪一天,他们两个都不一样

  • #if
    在编译时测试条件是否为真
  • 如果
    是在运行时计算的
  • #if
    的一些用法是:

    • 您希望在生成代码的调试版本时进行额外打印或检查
    • 您希望确保编译器不会两次包含.h文件
    • 您希望编写使用不同系统调用的代码,并根据编译代码时使用的系统使用适当的系统调用
    因为以上所有内容都是在编译时检查的,这意味着:

    • 条件必须能够在编译时进行计算
    • 生成的代码不会包含求值为false的分支,从而导致代码更小、速度更快,因为程序每次运行时都不会检查条件
    示例:

    仅为调试模式添加额外检查:

    #define DEBUGLEVEL 2
    
    #if DEBUGLEVEL > 1
       printf("The value of x is: %d", x);
    #end if
    
    #if DEBUGLEVEL > 2
       printf("The address of x is: %x", &x);
       ASSERT(x > 100);
    #end if
    
    确保仅包含一次标题:

    #ifndef PERSON_H
    #define PERSON_H
       class Person{
            ....
       };
    #end if
    
    根据平台具有不同的代码:

    #ifdef WINDOWS
       time = QueryPerformanceCounter(..);
    #else
       time = gettimeofday(..);
    #endif
    

    查找“预处理器”。我不理解-1。虽然这完全是一个愚蠢的问题,但这是一个非常有道理的问题。如果你不知道“preprocessor”关键字,就不太容易用谷歌搜索。我不理解“close as not constructive”投票:这是一个有点简单但完全合法的问题。@Krishnabharda既然你发现了一个重复的,你应该将这篇文章标记为重复的,并可能添加一条评论,这样人们就不会浪费时间回答这个问题了。我觉得这比所有“omg*scanf在没有阅读规范的情况下给出随机参数时不起作用”的问题更有建设性,因为用户每周都会提出这些问题,有时会对其进行投票。在我看来,它更像是一个复制品,但问题本身似乎是合理的。“一个用于编译阶段(#if),另一个用于编译阶段(if)”;)@米查尔布。是打字错误:)
    #ifdef WINDOWS
       time = QueryPerformanceCounter(..);
    #else
       time = gettimeofday(..);
    #endif