初识c语言 (一)
目录
1.编译器
2.main函数
3.关键字
4.字符和ASCII值,字符串和转义字符
5.注释的两种方法
6.数据类型
7.sizeof求数据长度
8.signed和unsigned及数据取值范围
9.变量
10.算术操作符
11.单目操作符
12.printf和scanf
编译器
常见编译器有msvc、clang、gcc
集成开发环境(IDE)= 编译器 + 链接器,有VS2022、XCode、DevC++等
VS2022中
在创建项目后添加源文件和头文件
- xxx.c为源文件
- xxx.h为头文件
main函数
c语言程序都是从main函数开始的,所以main函数也叫主函数。
即便有多个.c为文件,main函数也只能有一个。
关键字
⽐如: int 、 if 、 return ,这些符号被称为保留字或者关键字。
常用关键字
auto break case char const continue default do double else enum
extern
float for goto if int long register return short signed sizeof
staticstruct switch typedef union unsigned void volatile while
关键字可在https://zh.cppreference.com/w/c/keyword(C语⾔关键字的全部介绍)中查找
字符和ASCII值,字符串和转义字符
字符和ASCII码

字符实际上就是整型,例如printf(“%c\n”,65)就是字母A
记住大小写字母(a和A)差值为32
可打印字符展⽰:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 32; i <= 127; i++)
{
printf("%c ", i);
if (i % 16 == 15)
printf("\n");
}
return 0
}
字符串和\0
使⽤双引号括起来的⼀串字符就被称为字符串,如:“abcdef”。
- 单个字符可用**%c**打印
- 字符串**%s**打印
- 在字符串末尾实际上有一个**\0**,是结束标志,占一个字符且肉眼不可见,所以”abcdef"实际上是“abcdef\0”
- 我们在使⽤库函数 printf() 打印字符串或者strlen() 计算字符串⻓度的时候,遇到 \0 的时候就⾃动停⽌了。
转义字符
- ? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
- ’ :⽤于表⽰字符常量’
- " :⽤于表⽰⼀个字符串内部的双引号
- \ :⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
- \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
- \b :退格键,光标回退⼀个字符,但不删除字符。
- \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于 \v 。
- \n :换⾏符。
- \r :回⻋符,光标移到同⼀⾏的开头。
- \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个4/8的倍数。
- \v :垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。
下⾯2种转义字符可以理解为:字符的8进制或者16进制表⽰形式 - \ddd :d d d表⽰1~3个⼋进制的数字。 如: \130 表⽰字符X
- \xdd :d d表⽰2个⼗六进制数字。 如: \x30 表⽰字符0
这是转义字符c语言官方链接
注释的两种方式
- /* 注释内容 */
- //注释内容
数据类型
整型和浮点型分别对应整数和小数
整型
分为短整型(short)、标准整型(int)和长整型(long)和更长整型(long long)
//整数 - integer
//短整型
short [int]
[signed] short [int]
unsigned short [int]//[]里面的是可省略的部分
//整型
int
[signed] int
unsigned int
//⻓整型
long [int]
[signed] long [int]
unsigned long [int]//更⻓的整型
浮点型
分为float、double、long double,越往后精度(小数点位数)越高
float
double
long double
整数和浮点数的细节
1.当一个整数除以一个整数(用int定义过的)得出小数时,取结果整数部分,
如:
int main()
{
int a = 5;
int b = 2;
int c = a / b;
printf("%d",c);
return 0
}
最后得出的结果是2,取2.5的整数部分
而如何得到一个整数的每一位问题利用了这个特性
2.当用float定义时,就算后边是整数,也要写成小数形式
如:
错误形式 float a = 3
正确形式 float a = 3.0
布尔类型
1.布尔类型的使⽤得包含头⽂件 <stdbool.h>
2.布尔类型变量的取值是: true 或者 false .
代码演示:
Bool flag = true;
if (flag)
printf("i like C\n");
sizeof求数据类型长度
创建一个变量实际上是为这个变量在内存中开辟一块空间,而不同的类型所需的空间也不同。
sizeof便是专门来求这一长度的,单位是字节(Byte)
(一个二进制位是1比特(bit),1字节=8bit,1KB=1024字节)
sizeof 操作符的操作数可以是类型,也可是变量或者表达式。
sizeof( 类型 )//如int、char等
sizeof 表达式
而对于表达式,只看结果是什么类型的,例如是int就输出4(字节),是char就输出1,以此类推
注意sizeof()中()里的表达式是不计算的,如:
int main()
{
int a = 5;
int b = 3;
int c = 0;
printf("%zd",sizeof(c = a + b));
printf("%zd",c)
return 0;
}
输出的结果分别为4和0
(c = a + b)并没有计算
sizeof输出的结果是size_t类型的,要用“%zX”(X表示%d、%c等)打印
数据类型长度
如图

signed和unsigned及数据取值范围
signed和unsigned
- signed表示带符号的数,如signed int表示带正负号的整型
- unsigned表示非负数,如unsigned int表示非负整数
- 对于char是signed还是unsigned取决于当前系统
而int由signed变为unsigned的好处是取值范围扩大了一倍,signed int的取值范围是-32767~32767,而unsigned int的范围是0~65535
数据取值范围
其实每⼀种数据类型有⾃⼰的取值范围,也就是存储的数值的最⼤值和最⼩值的区间,有了丰富的类型,我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值:
limits.h ⽂件中说明了整型类型的取值范围。
float.h 这个头⽂件中说明浮点型类型的取值范围。为了代码的可移植性,需要知道某种整数类型的极限值时,应该尽量使⽤这些常量。
• SCHAR_MIN , SCHAR_MAX :signed char 的最⼩值和最⼤值。
• SHRT_MIN , SHRT_MAX :short 的最⼩值和最⼤值。
• INT_MIN , INT_MAX :int 的最⼩值和最⼤值。
• LONG_MIN , LONG_MAX :long 的最⼩值和最⼤值。
• LLONG_MIN , LLONG_MAX :long long 的最⼩值和最⼤值。
• UCHAR_MAX :unsigned char 的最⼤值。
• USHRT_MAX :unsigned short 的最⼤值。
• UINT_MAX :unsigned int 的最⼤值。
• ULONG_MAX :unsigned long 的最⼤值。
• ULLONG_MAX :unsigned long long的最大值
变量
• 全局变量:在⼤括号外部定义的变量就是全局变量
• 局部变量:在⼤括号内部定义的变量就是局部变量
全局变量的使⽤范围更⼴,整个⼯程中都能使⽤。
- 局部变量只能在⾃⼰所在的局部范围内使⽤。
- 如果局部和全局变量名字相同,局部变量优先使⽤
- 局部变量是放在内存的栈区
- 全局变量是放在内存的静态区

- 堆区是⽤来动态内存管理的
算术操作符
+、-、*、/、%(取余数)
- 对于除法,如果希望得到浮点数的结果,两个运算数必须至少有⼀个浮点数。
- %只能⽤于整数,不能⽤于浮点数
- 负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定
赋值操作符
=是赋值操作符,运算是从右到左赋值
复合赋值
对⼀个数进⾏⾃增、⾃减的操作,如下代码:
int a = 10;
a = a+3;
a = a-2;
这样代码C语⾔给提供了更加⽅便的写法:
int a = 10;
a += 3;
a -= 2;
复合赋值符有:
+= -=
*= /= %=
>>= <<= &= |= ^=
单目操作符
++和- -
前置++(++a):先加1,后使用。
后置++(a++):先使用,后加1。
而- -同理
printf和scanf函数
printf
有打印功能,格式为printf(“//内容”,(这里可能有变量))
想换行就加 \n(注意是右斜杠!!)
变为:printf(“//内容\n”,(这里可能有变量))
占位符
所谓 “占位符”,就是这个位置可以⽤其他值代⼊。
// 输出 There are 3 apples
#include <stdio.h>
int main()
{
printf("There are %d apples\n", 3);
return 0;
}
⾥⾯的 %d 就是占位符,表⽰这个位置要⽤其他值来替换。
占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这⾥代⼊的值必须是⼀个整数。
%s 表⽰代⼊的是⼀个字符串
%c 表⽰代⼊的是⼀个字符
参数与占位符是 从左到右一一 对应关系,如
printf("%d,%c,%s",1,'a',"abcdef")
占位符列举
• %a :⼗六进制浮点数,字⺟输出为⼩写。
• %A :⼗六进制浮点数,字⺟输出为⼤写。
• %c :字符。//char
•** %d** :⼗进制整数。// int
• %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
• %i :整数,基本等同于 %d 。
• %f :⼩数(包含 float 类型和 double 类型)。//float %f double - %lf
• %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e
为⼩写。
• %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
• %hd :⼗进制 short int 类型。
• %ho :⼋进制 short int 类型。
• %hx :⼗六进制 short int 类型。
• %hu :unsigned short int 类型。
• %ld :⼗进制 long int 类型。
• %lo :⼋进制 long int 类型。
• %lx :⼗六进制 long int 类型。
• %lu :unsigned long int 类型。
• %lld :⼗进制 long long int 类型。
• %llo :⼋进制 long long int 类型。
• %llx :⼗六进制 long long int 类型。
• %llu :unsigned long long int 类型。
• %Le :科学计数法表⽰的 long double 类型浮点数。
• %Lf :long double 类型浮点数。
• %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
• %o :⼋进制整数。
• %p :指针(⽤来打印地址)。
• %s :字符串。
• %u :⽆符号整数(unsigned int)。
• %x :⼗六进制整数。
• **%zd **: size_t 类型。
• %% :输出⼀个百分号。
输出格式
printf() 可以定制占位符的输出格式。
限定宽度
printf() 允许限定占位符的最小宽度。
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 "xx123"(x表示空格)
return 0;
}
上⾯示例中, %5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。
输出的值默认是右对齐,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。
如“%-5d”
对于⼩数,这个限定符会限制所有数字的最⼩显⽰宽度。
// 输出 " 123.450000"
#include <stdio.h>
int main()
{
printf("%12f\n", 123.45);
return 0;
}
上⾯⽰例中, %12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位,所以 123.45 输出结果的头部会添加2个空格。
总是显示正负号
默认情况下, printf() 不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可以在占位符的 % 后⾯加⼀个 + 。
限定小数位数
输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位,占位符可以写成 %.2f 。
最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,通过 printf() 的参数传⼊。
#include <stdio.h>
int main()
{
printf("%*.*f\n", 6, 2, 0.5);
return 0;
}// 等同于printf("%6.2f\n", 0.5);
上⾯⽰例中, %*.*f 的两个星号通过 printf() 的两个参数 6 和 2 传⼊。
输出部分字符串
%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.[m]s 指定输出的⻓度,其中 [m] 代表⼀个数字,表⽰所要输出的⻓度。
// 输出 hello
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
上⾯⽰例中,占位符 %.5s 表⽰只输出字符串“hello world”的前5个字符,即“hello”。
scanf函数
scanf() 函数⽤于读取⽤⼾的键盘输⼊。
程序运⾏到这个语句时,会停下来,等待⽤⼾从键盘输⼊。⽤⼾输⼊数据、按下回⻋键后, scanf() 就会处理⽤⼾的输⼊,将其存⼊变量。
格式为
scanf("%d", &i);
记住不要落下取地址符号&!!!(指针变量除外)
多个输入
1 scanf("%d%d%f%f", &i, &j, &x, &y);
scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
scanf的返回值
scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF (-1)。
一个可以反复输入的方法
while(scanf("%d",&a) != EOF)
C语言入门基础要点解析
8777

被折叠的 条评论
为什么被折叠?



