小言_互联网的博客

几个简单但你可能忽略的C知识点

311人阅读  评论(0)

 

C语言main函数的写法

标准中,只有下面两种写法:

int main (void/**body**/ }

以及

int main (int argc, char *argv[]/**body**/ }

而C++的第二种与C类似,第一种是这样的:

int main (/**body**/ }

参考《C语言的main函数到底该怎么写

​如果没有返回类型


  
  1. #include<stdio.h>
  2. test()
  3. {
  4.      printf( "https://www.yanbinghu.com\n");
  5. }
  6. int main(void)
  7. {
  8.     test();
  9.      return  0;
  10. }

它会默认为int


  
  1. $ gcc -o test test.c 
  2. test.c: 2: 1: warning:  return  type defaults to ‘ int’ [-Wimplicit- int]
  3.  test()
  4.  ^

注意,使用函数前一定要声明,对于没有声明,而试图使用,可能会错将int用成其他类型,导致灾难。参考《记64位地址截断引发的挂死问题

如果main函数没有return


  
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.      printf( "lalalala\n");
  5. }

编译器一般都会帮你在最后加上return 0。

结构体成员赋值

结构体里还有结构体,你还一个一个成员的复制?


  
  1. //来源:公众号编程珠玑
  2. //https://www.yanbinghu.com
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<stdlib.h>
  6. struct Info_t0
  7. {
  8.      int a;
  9.      int b;
  10.      char str[ 128];
  11. };
  12. struct Info_t
  13. {
  14.      struct Info_t0 c;
  15.      int d;
  16. };
  17. int main(void)
  18. {
  19.      struct Info_t *test = malloc(sizeof(struct Info_t));
  20.      memset(test, 0, sizeof(struct Info_t));
  21.     test->c.a =  10;
  22.     test->c.b =  24;
  23.      strncpy(test->c.str, "https://www.yanbinghu.com", sizeof( "https://www.yanbinghu.com"));
  24.     test->d =  10;
  25.      struct Info_t test1;
  26.     test1.c = test->c; //成员直接赋值,完成拷贝
  27.      free(test);
  28.     test =  NULL;
  29.      printf( "test1.c.a = %d,test1.c.b = %d test1.c.str = %s\n",test1.c.a ,test1.c.b,test1.c.str);
  30.      return  0;
  31. }

输出结果:

test1.c.a = 10,test1.c.b = 24 test1.c.str = https://www.yanbinghu.com

打印字符串不检查空

打印字符串时,没有结束位置是致命的!


  
  1. //来源:公众号编程珠玑
  2. //https://www.yanbinghu.com
  3. #include<stdio.h>
  4. int main(void)
  5. {
  6.      char *p =  NULL;
  7.      printf( "%s\n",p); //灾难!
  8.      char arr[] = { 'h', 'e', 'l', 'l', 'o'};
  9.      printf( "%s\n",arr); //灾难!
  10.      return  0;
  11. }

参考《NULL,0,'\0'的区别》和《你可能不知道的printf》。

输出百分号


  
  1. //来源:公众号编程珠玑
  2. //https://www.yanbinghu.com
  3. #include<stdio.h>
  4. int main(void)
  5. {
  6.      printf( "%%\n"); //输出%号 
  7.      return  0;
  8. }

代码太长换行


  
  1. #include <stdio.h>
  2. #define TEST "https://www.yan\
  3. binghu.com"
  4. int main()
  5. {
  6.      printf( "Hello World %s\n",TEST);
  7.      return  0;
  8. }

判断两数之和是否超出范围

相关文章《C语言入坑指南-整型的隐式转换与溢出》。


  
  1. //来源:公众号【编程珠玑】
  2. #include <stdio.h>
  3. #include <limits.h>
  4. int main()
  5. {
  6.      int a = INT_MAX -  10;
  7.      int b = INT_MAX -  20;
  8.      //if(a + b > INT_MAX),不能这样做
  9.      if(a > INT_MAX - b)
  10.          printf( "a + b > INT_MAX");
  11.      return  0;
  12. }

求平均值:


  
  1. //来源:公众号【编程珠玑】
  2. #include <stdio.h>
  3. #include <limits.h>
  4. int average(int a,int b)
  5. {
  6.      return ( b - (b - a) /  2 );
  7. }
  8. int main()
  9. {
  10.      int a =  100;
  11.      int b = INT_MAX -  10;
  12.      printf( "average a b:%d\n",average(a,b));
  13.      return  0;
  14. }

但这样还有问题,为什么???

原文地址:https://www.yanbinghu.com/2020/01/01/152.html

来源:公众号【编程珠玑】

作者:守望先生

ID:shouwangxiansheng

相关精彩推荐

每天都在用printf,你知道变长参数是怎么实现的吗

你可能不知道的printf

C语言入坑指南-被遗忘的初始化

C语言入坑指南-整型的隐式转换与溢出

 

关注公众号【编程珠玑】,获取更多Linux/C/C++/数据结构与算法/计算机基础/工具等原创技术文章。后台免费获取经典电子书和视频资源


转载:https://blog.csdn.net/hyb612/article/details/103829609
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场