C语言容易忽略的知识点

C语言main函数的写法

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

1
int main (void) { /**body**/ }

以及

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

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

1
int main () { /**body**/ }

如果没有返回类型

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

它会默认为int

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

注意,使用函数前一定要声明,对于没有声明,而试图使用,可能会错将int用成其他类型,导致灾难。

如果main函数没有return

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

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

结构体成员赋值

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

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

输出结果:

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

打印字符串不检查空

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

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

参考《NULL,0,’\0’的区别》。

输出百分号

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

代码太长换行

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

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

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

求平均值:

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

守望 wechat
关注公众号[编程珠玑]获取更多原创技术文章
出入相友,守望相助!