C语言---初窥门径

Sep 21 2100 C语言


高级语言-》汇编语言-》机器语言

gcc main.c && ./a.out 表示先gcc main.c,再在这个基础上运行./a.out,&&表示运行的承接

1
2
3
\\打印\本身
\'打印小点'
\"打印双引号"

可以简单理解变量为:内存需要找到一个位置存放CPU要处理的数据,每个数据都有一个地址,这些地址实际上就是一些数字,计算机很擅长处理这些,我们为了更好的标记这些数据,就给这些数据贴上了标签,这个标签就是变量。它的核心作用就是​让人类和编译器能通过名字(而不是原始数字地址)操作数据​​。

变量首字母只能用字母和下划线来命名

\斜杠的作用:
下面这个代码会报错,因为不加操作的话,printf打印的东西需要双引号都包含着在同一行,

1
2
3
4
5
6
7
#include <stdio.h>

int main(void)
{
printf("
");
}

解决方法:加上一个\,就可以起到高速编译器他们是一起的,只是空间不够换写了一行罢了

1
2
3
4
5
6
7
#include <stdio.h>

int main(void)
{
printf("\
");
}


传统的C语言有32个关键字。C99标准增加了5个关键字,一共37个。C11标准增加了7个,一共44个。

int a 整形 //在内存中找到一个整形大小的位置,并且给他命名为a
char b 字符型 //在内存中找到一个字节大小的位置,并且给他命名为b
float c 单精度浮点型 //在内存中找到一个单精度浮点数型数据大小的位置,并且命名为c
double d 双精度浮点型//在内存中找到一个双精度浮点型数据大小的位置,并且命名为d
简单来说,double比float可以容纳更多的小数位

什么是常量呢?在程序运行的过程中,它的值不能够被改变,称为常量。如字符’a’,数字520,小数3.14,这些都是常量,因为它们仅代表一个具体的值,并且不能够被改变。

C语言中常见的常量如下。

符号常量:
#define 标识符 常量
定义符号常量可以通过宏定义(#define)或 const关键字​​
编译器会自动识别define定义的那些变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

#define URL "http://www.fishc.com"
#define NAME "鱼C工作室"
#define BOSS "小甲鱼"
#define YEAR 2010
#define MONTH 5
#define DAY 20

int main(void)
{
printf("%s成立于%d年%d月%d日\n", NAME, YEAR, MONTH, DAY);
printf("%s是%s创立的……\n", NAME, BOSS);
printf("%s的域名是%s\n", NAME, URL);

return 0;
}

转移字符’\0’作用:

C语言的五种数据类型:

让整数占用更少的内存可以在int前面加short,让整数占用更多内存可以在int前面加long,例如:

1
2
short int a = 10;
long int b = 102929;

这样a只占用2个字节的内存,而b可能(是可能)会占用8个字节的内存。

也可以将int省略,只写short、long,如下:

1
2
3
short a = 10;
long b = 102929;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main(void)
{
printf("int = %d\n", sizeof(int));
printf("short int = %d\n", sizeof(short int));
printf("long int = %d\n", sizeof(long int));
printf("long long int = %d\n", sizeof(long long int));
printf("char = %d\n", sizeof(char));
printf("_Bool = %d\n", sizeof(_Bool));
printf("float = %d\n", sizeof(float));
printf("double = %d\n", sizeof(double));
printf("long double = %d\n", sizeof(long double));

return 0;
}
1
2
3
4
5
6
7
8
9
int = 4
short int = 2
long int = 8
long long int = 8
char = 1
_Bool = 1
float = 4
double = 8
long double = 16

int i
我们可以使用sizeof(int) sizeof(i),直接可以sizeof()数据类型和变量

short、int、long等整型类型​​默认带符号​​,等价于 signed short。

除非显式声明为 unsigned short,否则编译器会假定其为有符号类型。

1
2
3
4
5
6
7
8
9
#include<stdio.h>

int main(void){
short i=-1;
unsigned short j=-1;
printf("%d\n",i); //结果-1
printf("%d\n",j); //结果65535s
return 0;
}

来看一个代码:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <math.h>

int main(void)
{
nt result = pow(2, 32) - 1;

printf("result = %u\n", result);

return 0;
}

报错: warning: overflow in conversion from ‘double’ to ‘int’ changes value from ‘4.294967295e+9’ to ‘2147483647’ [-Woverflow]
报错显示已经溢出了

修正结果:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <math.h>

int main(void)
{
unsigned int result = pow(2, 32) - 1;

printf("result = %u\n", result); //记住无符号类型为%u

return 0;
}

因为使用到了math库,在编译的时候要加上一个-lm,表示链接作用

​​无符号类型(unsigned)的输出格式符确实是 %u​​,但具体使用时需根据数据类型选择匹配的格式符。

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
unsigned int

%u

printf("%u", x);

最常用,默认无符号整型

unsigned short

%hu

printf("%hu", (unsigned short)x);

需加 h前缀(short"half word"

unsigned long

%lu

printf("%lu", (unsigned long)x);

32/64位系统通用

unsigned long long

%llu

printf("%llu", (unsigned long long)x);

C99标准引入

为什么一字节为-128到+127

1000000表示最小值-128,00000000为0,0111111为最大值127

计算机是使用补码存放数据的
字符如果用%d表示的话,那就是一个ASCALL码

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main(void)
{
char a='c';
printf("%c is %d",a,a);

return 0;
}
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void)
{
char a = 70, b = 105, c = 115, d = 104, e = 67;

printf("%c%c%c%c%c\n", a, b, c, d, e);

return 0;
}

仔细看一下上面的知识点,%c和整数可以相互转换

编程的时候一定要小心一些变量的定义,例如:下面这个是不小心char的定义的

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main(void)
{
char height;

height = 170;
printf("小甲鱼的身高是%d厘米!\n", height);

return 0;
}

字符串实际上就是一串字符,只需要在内存当中找到一块空间,存放一串字符,就是组成了字符串,但是注意最后面要加一个’\0’,让编译器知道字符串到这个地方就终止了
可以使用下面三种方法定义字符串:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main(void)
{
char a[6] = {'F', 'i', 's', 'h', 'C', '\0'};//字符串要在最后面加上一个\0
char b[]="FishC"; //编译器会自动帮你计算
char c[]={"FishC"};
printf("%ld\n",sizeof(b)/sizeof(char));


return 0;
}
1
printf("%f\n",1+1.0);

上面这个代码会发生什么呢:会打印3.000000
当一个运算符的几个操作数类型不同时,编译器需要将它们转换为相同的数据类型才能进行运算。通常情况下,编译器会将占用“坑位”较小的操作数转换为占用“坑位较大的操作数的数据类型,再进行运算。这样做是为了确保计算的精确度。
当遇到类似 1+2.0 这种两种不同数据类型的操作数的运算时,编译器首先将1转换为浮点型 1.0,然后再与2.0相加,得到同样为浮点型的结果3.0。
因为1.0所占坑位比1的大

也可以进行强类型转换

printf(“%d\n”,1+(int)1.0);

那下面这个会打印什么呢:
printf(“%d\n”,1+(int)1.8);会打印2,C语言编译器不会四舍五入,他会直接取整数部分,舍弃掉小数部分