精华内容
下载资源
问答
  • 相信很多朋友在学习C语言过程中,都看到过EOF字样,但翻过整本C语言的书,也没有看到有这个函数或者关键字,岂不感觉很奇怪?难道学不细有疏漏吗?当然不是!这里笔者告诉您一个技巧,如果您在看代码过程中...

    相信很多朋友在学习C语言过程中,都看到过EOF的字样,但翻过整本C语言的书,也没有看到有这个函数或者关键字的,岂不是感觉很奇怪?难道学的不细有疏漏吗?当然不是!这里笔者告诉您一个技巧,如果您在看代码过程中,看到特殊的字符感觉不是关键字也不是函数,那您首先要想到的就是:这个东西是不是#define或者typedef过的呢?

    直接开门见山,比如ACM比赛经常有这样的代码:while(scanf(“%d%d”)!=EOF)

    这玩意啥意思呢?首先scanf你写while里就很奇怪了,初学者表示没见过这么嵌套写的,再加个EOF更离谱了,都让人怀疑这是不是C代码了……

    那给大家讲一下,首先这个代码scanf能写while里是因为scanf(“%d%d”)!=EOF本身是个逻辑判断,也就是真或者假,所以可以作为条件判断写到while里,那么最主要的问题来了,EOF到底啥玩意?

    好了,如果您学了C语言中的宏定义就一切真相大白了,您不妨打开我们最常用的stdio.h这个头文件(不知道怎么打开?随便打开一个包含这个头文件的程序,右键即可),然后搜索EOF即可发现答案! 如下:
    在这里插入图片描述
    在这里插入图片描述

    怎么样?看到了吧,EOF其实就是-1!

    也就是说EOF就是个数字,被定义为-1而已!

    为什么这样做呢? stdio.h作为一个标准输入输出的头文件,自然会定义很多标准的东西,那么EOF正是因此而生,且听笔者慢慢道来:

    在我们进行包括scanf等的输入函数使用时,其实用户在cmd中的输入实际是存放于缓冲区当中,当用户键入回车那一瞬间,之前输入的数据才会被存进去,而这里无论是单个字符还是字符串,我们都知道scanf的返回值呢是表示成功接受到的对象的个数,那这里如果遇到特殊情况,比如缓冲区文件流满等问题,那么scanf将如何处理呢?答案是返回-1 ! 这里不光是scanf,返回值为个数的函数,遇到文件流满大多都会返回-1,所以这个-1用的比较多,那么stdio.h就索性专门定义一个宏来表示,取End Of File(文件末尾的意思)的前三个字母即组成EOF,所以也就有了 #define EOF (-1) 这样的话!

    那么,现在看懂了吗?

    转载自C语言研究中心(www.dotcpp.com)

    展开全文
  • include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status;...Triplet已经定义为 ElemType* ,那Triplet &TT是什么
  • c语言中FLT_DIG和DBL_DIG是什么意思

    千次阅读 2018-11-20 15:15:33
    存放浮点型数据,并不能精确表示。 这两个宏在float.h头文件下面,用来说明double、float两种数据类型有效数字位数,注意不是小数点后面有效位数,而是所有位数。 #define DBL_DIG 15 /* # of ...

    算里存放浮点型数据,并不能精确表示。

    这两个宏在float.h头文件下面,用来说明double、float两种数据类型有效数字的位数,注意不是小数点后面的有效位数,而是所有位数。

    #define DBL_DIG         15                      /* # of decimal digits of precision */

    #define FLT_DIG         6                       /* # of decimal digits of precision */

    float能保证的有效位数最多是6~7位,完全能保证的是6位,double是15~16位,完全能保证的是15位。

     

     

    float.h

    #ifndef FLT_DIG
    #define FLT_DIG         6
    #endif

     

    #ifndef DBL_DIG
    #define DBL_DIG         15
    #endif

     

    #ifndef DBL_MAX
    #define DBL_MAX     1.7976931348623158e+308  /* max decimal value of a double */
    #endif

    #ifndef DBL_MIN
    #define DBL_MIN     2.2250738585072014e-308
    #endif
     

     

    #ifdef __LONGDOUBLE128

    /* POWER 128 bit long double */
    #define LDBL_MANT_DIG      106
    #define LDBL_EPSILON       0.24651903288156618919116517665087070E-31L
    #define LDBL_DIG           31
    #define LDBL_MIN_EXP       DBL_MIN_EXP
    #define LDBL_MIN           ((long double) DBL_MIN)
    #define LDBL_MIN_10_EXP    DBL_MIN_10_EXP
    #define LDBL_MAX_EXP       DBL_MAX_EXP
    #define LDBL_MAX           0.1797693134862315807937289714053023E+309L
    #define LDBL_MAX_10_EXP    DBL_MAX_10_EXP

    #elif defined(__LONGDOUBLE80)

    /* IA64 80 bit long double */
    #define LDBL_MANT_DIG      64
    #define LDBL_EPSILON       1.0842021724855044340075E-19L
    #define LDBL_DIG           18
    #define LDBL_MIN_EXP       (-16381)
    #define LDBL_MIN           3.36210314311209350626e-4932L
    #define LDBL_MIN_10_EXP    (-4931)
    #define LDBL_MAX_EXP       16384
    #define LDBL_MAX           1.18973149535723176502e+4932L
    #define LDBL_MAX_10_EXP    4932

    #else

    /* default 64 bit long double */
    #define LDBL_MANT_DIG      DBL_MANT_DIG
    #define LDBL_EPSILON       DBL_EPSILON
    #define LDBL_DIG           DBL_DIG

    #define LDBL_EPSILON       DBL_EPSILON
    #define LDBL_DIG           DBL_DIG
    #define LDBL_MIN_EXP       DBL_MIN_EXP
    #define LDBL_MIN           DBL_MIN
    #define LDBL_MIN_10_EXP    DBL_MIN_10_EXP
    #define LDBL_MAX_EXP       DBL_MAX_EXP
    #define LDBL_MAX           DBL_MAX
    #define LDBL_MAX_10_EXP    DBL_MAX_10_EXP

    #endif /* __LONGDOUBLE128 */

    #ifdef _ISOC99_SOURCE
    #define DECIMAL_DIG        37
    #endif

     

    展开全文
  • 最近在代码中看到很多可变参数宏函数中使用了##__VA_ARGS__这种东西, 之前写过一篇博客是说##用法是在宏定义中把位于它两边符号...那么问题是在可变参数宏里面##又是是什么意思?和不用##又有什么区别呢? 我...

    最近在代码中看到很多可变参数宏函数中使用了##__VA_ARGS__这种东西, 之前写过一篇博客是说##的用法是在宏定义中把位于它两边的符号连接成一个符号

    在<C和指针>P283介绍了这样一种用法:

    这种常见的##用法的结果就是:ADD_TO_SUM(5,25)<=>sum5+=25

    那么问题是在可变参数宏里面的##又是是什么意思?和不用##又有什么区别呢?

    我找到一篇写得比较好的博客贴在下面:

    【转】https://www.cnblogs.com/langzou/p/6674528.html

    在C99中规定宏也可以像函数一样带可变的参数,如:

    #define LOG(format, ...) fprintf(stdout, format, __VA_ARGS__)  

    其中,...表示可变参数列表,__VA_ARGS__在预处理中,会被实际的参数集(实参列表)所替换。
    同时gcc还支持带可以变参数名的方式(注意:VC不支持):

    #define LOG(format, args...) fprintf(stdout, format, args)  

    同样,args在预处理过程中,会被实际的参数集所替换。其用法和上面的方式一样,只是参数的符号有变。

    但是这样就会有一个问题, 如果我输入的可变参数列表为空时, 就会多一个逗号出来导致语法错误

    从gcc -E看预处理结果可以清楚地看到对于可变参数输入为空的情况没有很好解决逗号的问题导致报错

    root@ubuntu:/lianxi/lianxi_oj/MACRO# gcc vary_param.c 
    vary_param.c: 在函数‘main’中:
    vary_param.c:6:2: 错误: expected expression before ‘)’ token
    root@ubuntu:/lianxi/lianxi_oj/MACRO# 
    gcc -E vary_param.c
    ...
    int main(void)
    {
     printf("test value is %d\n",5);
     printf("test value is null\n",);
     return 0;
    }
    root@ubuntu:/lianxi/lianxi_oj/MACRO# 
    

     

      1 #include <stdio.h>
      2 #define MYPRINT(format,...) printf(format,__VA_ARGS__)
      3 int main(void)
      4 {
      5     MYPRINT("test value is %d\n", 5);
      6     MYPRINT("test value is null\n");
      7     return 0;
      8 }

    这里就不得不说##的另一个作用了:

    “##”的另一个作用是对token进行连接,上例中format,args,__VA_ARGS都可以看作是token,如果token为空,“##”则不进行连接,还可以帮忙去掉那个多余的逗号,所以允许省略可变参数, 用##__VA_ARGS__实现的宏函数健壮性更好

    root@ubuntu:/lianxi/lianxi_oj/MACRO# gcc vary_param.c 
    root@ubuntu:/lianxi/lianxi_oj/MACRO# ./a.out
    test value is 5
    test value is null
    root@ubuntu:/lianxi/lianxi_oj/MACRO# 
    gcc -E vary_param.c
    ...
    int main(void)
    {
     printf("test value is %d\n", 5);
     printf("test value is null\n");
     return 0;
    }
    root@ubuntu:/lianxi/lianxi_oj/MACRO# 
    
      1 #include <stdio.h>
      2 //#define MYPRINT(format,...) printf(format,__VA_ARGS__)
      3 #define MYPRINT(format,...) printf(format,##__VA_ARGS__)
      4 int main(void)
      5 {   
      6     MYPRINT("test value is %d\n", 5);
      7     MYPRINT("test value is null\n");
      8     return 0;
      9 }

     

    展开全文
  • 如题所示,最近看到C语言里面一个宏定义: #define QMI_SVC_HDLR(cmdval, hdlr) {cmdval, #hdlr, hdlr} 实在是看不懂是什么意思,特别是#hdlr,这个是啥意思啊,求大神指导
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    3.20 “semanticsof‘’changeinANSIC”警告是什么意思? 3.21 “无符号保护”和“值保护”规则区别在哪里? 第4章 指针 基本指针应用 4.1 指针到底有什么好处? 4.2 我想声明一个指针并为它分配...
  • 同样是在跟linux内核源码时候,看到这样宏定义   #define __stringify_1(x...) #x #define __stringify(x...) __stringify_... #x又是什么意思?   #x是将x转换成字符串。 比如下面代码   printf(__stringify

    同样是在跟linux内核源码的时候,看到这样的宏定义

     

    #define __stringify_1(x...) #x
    #define __stringify(x...) __stringify_1(x)

    x...是什么意思呢? #x又是什么意思?

     

    #x是将x转换成字符串。

    比如下面代码

     

    printf(__stringify_1(hello) );

    输出结果为 hello

     

    那么x...又是什么意思呢?

    表示支持其他符合输入。

     

     

    比如

    #define TOSTRING(x)  #x

    printf(TOSTRING(hello, kk) );

    编译报错

    加上...后

    #define TOSTRING(x...)  #x

    printf(TOSTRING(hello, kk) );

    编译通过

    输出结果为

    hello, kk

     

    x...有一个用法

    以前我的DEBUG错误打印宏是这样定义的

    #define DEBUG_ERR(buf) printf("Error:"buf)
    #define DEBUG_ERR_ARG(buf, ...) printf("Error:"buf, __VA_ARGS__)

    将带参数和不带参数的分开,不然编译会报错

     

    知道这个用法之后只需要一个函数搞定

    #define DEBUG_ERR(buf...) printf("Error:"buf)
    这样带没带参数都可以了

     

      #define DEBUG_ERR(buf...) printf("Error: "buf)
     
      int main()
      {
      
          int len = 100;
      
          DEBUG_ERR("len is out of range , len = %d\n", len);
     
     
         return 0;
      }

    输出结果为

    Error: len is out of range , len = 100

     

    展开全文
  • 条件编译是C语言中预处理部分内容,它编译器编译代码时最先处理部分, 条件编译里面有判断语句,比如 #if 、#else 、#elif 及 #endif 它的意思是如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这...
  • 3.20 “semantics of‘’change in ANSI C”警告是什么意思? 3.21 “无符号保护”和“值保护”规则区别在哪里? 第4章 指针 基本指针应用 4.1 指针到底有什么好处? 4.2 我想声明一个指针并为它分配一些空间...
  • 这个语法应该很多人知道,看来还是我基础不好,所以才一时没看懂 同样在跟内核代码码时发现 #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)   ...其实不是,真正的意思是
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    3.20 “semantics of‘’change in ANSI C”警告是什么意思? 42 3.21 “无符号保护”和“值保护”规则区别在哪里? 42 第4章 指针 45 基本指针应用 45 4.1 指针到底有什么好处? 45 4.2 我想声明...
  • 3.20 “semantics of‘’change in ANSI C”警告是什么意思? 42 3.21 “无符号保护”和“值保护”规则区别在哪里? 42 第4章 指针 45 基本指针应用 45 4.1 指针到底有什么好处? 45 4.2 我想声明...
  • 3.20 “semanticsof‘’changeinANSIC”警告是什么意思? 3.21 “无符号保护”和“值保护”规则区别在哪里? 第4章 指针 基本指针应用 4.1 指针到底有什么好处?  4.2 我想声明一个指针并为它分配一些...
  •  保护规则 3.20 “semanticsof‘’changeinANSIC”警告是什么意思? 3.21 “无符号保护”和“值保护”规则区别在哪里? 第4章 指针 基本指针应用 4.1 指针到底有什么好处? 4.2 我想声明一个指针并为...
  •  3.20 “semantics of‘’change in ANSI C”警告是什么意思?  3.21 “无符号保护”和“值保护”规则区别在哪里? 第4章 指针  基本指针应用  4.1 指针到底有什么好处?  4.2 我想声明一个指针并为它...
  • 3.20 “semantics of‘>’change in ANSI C”警告是什么意思? 71 3.21 “无符号保护”和“值保护”规则区别在哪里? 71 第4章 指针 74 基本指针应用 74 4.1 指针到底有什么好处? 74 4.2 我想声明一个...
  • 3.20 “semantics of‘>’change in ANSI C”警告是什么意思? 71 3.21 “无符号保护”和“值保护”规则区别在哪里? 71 第4章 指针 74 基本指针应用 74 4.1 指针到底有什么好处? 74 4.2 我想声明一个...
  • 3.20 “semantics of‘’change in ANSI C”警告是什么意思? 3.21 “无符号保护”和“值保护”规则区别在哪里? 第4章 指针 基本指针应用 4.1 指针到底有什么好处? 4.2 我想声明一个指针并为它分配一些空间...
  • 你必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    1.4 extern 在函数声明中是什么意思? . . . . . . . . . . . . . . . . . 2 1.5 关键字auto 到底有什么用途? . . . . . . . . . . . . . . . . . . . 2 1.6 我似乎不能成功定义一个链表。我试过typedef struct f ...
  • o 6.15 运行时 ``空指针赋值" 错误是什么意思? * 7. 数组和指针 o 7.1 我在一个源文件中定义了 char a[6], 在另一个中声明了 extern char *a 。为什么不行 ? o 7.2 可是我听说 char a[ ] 和 char *a 是...
  • C语言也能干大事 全部板书

    热门讨论 2011-08-08 14:35:18
    首先说“|”是什么意思?“|”是位运算里的“或”运算,只有对应的两个二进位有一位为1时,结果位才为1 ,否则为0。MB_OK、MB_OKCANCEL等的低四位不同,但是高位永远为0;MB_ICONHAND、MB_ICONQUESTION等的低5至第8...
  • 例如, pf1+pf2是什么意思呢?毫无实际意义。 ②两指针变量进行关系运算 指向同一数组两指针变量进行关系运算可表示它们所指数组元素之间关系。例如: pf1==pf2表示pf1和pf2指向同一数组元素 pf1>pf2表示pf1...
  • sizeof(int)*p是什么意思4*P 枚举和#define区别 1),#define 宏常量是在预编译阶段进行简单替换。枚举常量则是在编译时候确定其值。 2),一般在编译器,可以调试枚举常量,但是不能调试宏常量。 3)...
  • C语言似乎已经忘记完了,现在学习NIOS II,只得从新抓其C语言来学学了。 ... 里面经常用到 1 #ifndef...2 3 #define...4 5 6 #...然后百度了一下,原来这几句代码的意思是“如果没什么,则定义什么”最后以#endi...
  • 、__IO是什么意思?这是ST库里面宏定义,定义如下: #define   __I   volatile const    #define   __O   volatile            #define   __IO   volatile            显然,这三个...
  • 刚参加工作,看到单位里的代码,虽说是C语言写的,但是各种宏定义,各种#define和#typedef,看代码把我看得怀疑人生。代码里常见到其中之一的宏定义便是UNREFERENCED_PARAMETER。那么这个宏定义是什么意思?又是怎么...
  • Swift3闭包相关

    2017-04-07 07:03:00
    几乎所有编程语言里都有简化函数写法,c语言里是宏函数(#define),c++里内联函数(inline,顺带一说,inline内联的意思,在html里display里指定inline也内联的意思) Swift强大之处非常之多,在...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

c语言里的define是什么意思

c语言 订阅