立即注册

ekn

2019人工智能创新平台招新仅注册用户才可以浏览全站
查看: 1789|回复: 2

稀奇古怪的C语言

[复制链接]

12

主题

16

帖子

133

积分

版主

Rank: 7Rank: 7Rank: 7

积分
133
发表于 2020-3-28 23:03:38 | 显示全部楼层 |阅读模式
本帖最后由 pk1206 于 2020-3-28 23:43 编辑

本帖用来记录一些稀奇古怪的C语言用法。奇怪的知识又增加了

目录:
1、点点点
2、注释注释
回复

使用道具 举报

12

主题

16

帖子

133

积分

版主

Rank: 7Rank: 7Rank: 7

积分
133
 楼主| 发表于 2020-3-28 23:27:48 | 显示全部楼层
点点点

在C语言中,有一类比较特殊的函数,它们的参数个数是不确定的,比如printf函数族,其原型如下:
  1. int printf(const char *format, ...);
复制代码
即C语言用三个点来表示参数的个数是不确定的(这就是省略号么 )。除此之外,三个点还可以表示一个区间,请看以下测试代码:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int num;
  5.     while(printf("输入一个整数:"), scanf("%d", &num) != EOF)
  6.     {
  7.         switch(num)
  8.         {
  9.             case 1 ... 4:
  10.                 printf("the first case\n");
  11.                 break;

  12.             case -10 ... -6:
  13.                 printf("the second case\n");
  14.                 break;

  15.             default:
  16.                 printf("unknow case\n");
  17.                 break;
  18.         }
  19.     }
  20.     return 0;
  21. }
复制代码
测试结果如下:
  1. pk@PKP73:c$ ./test_...
  2. 输入一个整数:0
  3. unknow case
  4. 输入一个整数:1
  5. the first case
  6. 输入一个整数:2
  7. the first case
  8. 输入一个整数:4
  9. the first case
  10. 输入一个整数:-7
  11. the second case
  12. 输入一个整数:
复制代码

不难看出,1/2/4 都进入了第一个case,-7进入了第二个case,而0进入了default。
也就是说,如果有连续的整数属于同一种case,可以使用三个点来简化代码,特别是范围还很大的情况下,而不必使用类似于下面的代码:
  1. case 1:
  2. case 2:
  3. case 3:
  4. case 4:
复制代码
缺点也还是有的:
1、使用条件太苛刻了,必须是连续的区间。如果是 1~50, 52~100的情况,还是要配合连续case语句。
2、太偏门了,如果代码的owner发生了变化,可维护性急剧下降。

注意:
1、三个点和两个数之间,必须要有空格。否则,编译会报错。
2、左边的数必须不大于右边的数。否则,编译会警告范围为空。
3、左边和右边都是闭区间,注意不要出现区间重叠。否则,编译会报错。
回复

使用道具 举报

12

主题

16

帖子

133

积分

版主

Rank: 7Rank: 7Rank: 7

积分
133
 楼主| 发表于 2020-3-29 00:08:50 | 显示全部楼层
注释注释

奇怪的标题,不过还是能否强行说通的,第一个“注释”是动词,第二个“注释”是名词。

进入正题,调试代码的时候,可能会遇到打开一条语句,同时关闭另外一条语句情况。有可能语句比较复杂,不想删除关闭的语句。例如以下代码:
  1. value = this_is_very_complex_func(arg1, arg2, arg3, arg4);
  2. // value = this_is_another_very_complex_func(arg1, arg2, arg3, arg4);
复制代码

如果使用单行注释,每次需要改两个地方,删除注释和添加注释。但是,巧妙的利用注释嵌套,可以做到只用改一个地方:
  1. value = /* this_is_very_complex_func(arg1, arg2, arg3, arg4); // */ this_is_another_very_complex_func(arg1, arg2, arg3, arg4);
复制代码
如果加上前面的“/*”,则关闭this_is_very_complex_func(),同时打开this_is_another_very_complex_func()。反之亦然。

局限也是有的,这个只适用于单行语句,而且要改动两个字符。如果是语句块,使用条件预编译指令会更加的方便。而且条件预编译指令可以做到只用改一个字符!!!这个以后介绍。
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|小黑屋|ekn

GMT+8, 2024-5-17 16:52 , Processed in 0.013706 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表