文章目录
一、main函数
- main函数是程序的⼊⼝。
- main函数有且仅有⼀个。
- 即使⼀个项⽬中有多个.c⽂件,但是只能有⼀个main函数。
第⼀次写代码,⼀些常⻅的错误需要注意:
- 英文main 被写成了mian。
- main后边的()漏掉了。
- 代码中不能使⽤中⽂的括号(,)或句号(。)
- ⼀条语句写完后,要有分号(;)
二、printf和库函数
printf 是⼀个库函数,它的功能是在标准输出设备(⼀般指屏幕)上进⾏打印信息的。
例如:
printf("Hello world !");
运行结果:
这一行代码的含义就是打印出字符串Hello world!。
printf函数也可以⽤来打印其他类型的数据,⽐如:
int n = 100;
printf("%d\n", n);//打印整数
printf("%c\n", 'q');//打印字符
printf("%lf\n", 3.14);//打印双精度浮点数
括号里面的%d以及%c等等在这里都是占位符,表示的是后面值的类型,同时所处的位置都会被后边的值所替代。
printf函数就是包含在<stdio.h>这个头文件里面的,因此使用的时候需要在文件开头声明对应的头文件。如:#include<stdio.h>
那什么是库函数呢?
为了不再重复实现常⻅的代码,让程序员提升开发效率,C语⾔标准规定了⼀组函数,提供给程序员使⽤。这些函数组成了⼀个函数库,被称为标准库,这些函数也被称为库函数。
⼀个系列的库函数⼀般会声明在同⼀个头⽂件中,所以库函数的使⽤,要包含对应的头文件。点击查看库函数
三、关键词
C语⾔中有⼀批保留名字的符号,⽐如: int 、 if 、 return等这些符号被称为保留字或者关键字。
关键词有以下注意事项:
- 关键字都有特殊的意义,是保留给C语⾔使⽤的。
- 程序员⾃⼰在创建标识符的时候是不能和关键字重复的。
- 关键字是不能⾃⼰创建的。
C语⾔的32个关键字如下:
数据类型 | 控制语句 | 存储类型 | 其他 |
---|---|---|---|
char :字符型 | for :常用循环语句 | aoto :声明自动变量 | const :声明只读变量 |
int : 整型 | do :与while结合构成do-while 循环 | extern :声明变量 | volatile :变量可被隐含改变 |
float :单精度浮点型 | while :循环语句 | register :声明寄存器变量 | |
double :双精度浮点型 | break :跳出当前循环 | static :声明静态变量 | |
void :无类型 | continue :结束当前循环的本次迭代 | ||
short :短整型 | if :条件语句 | ||
long :长整型 | else :条件语句的否定分支 | ||
signed : 有符号类型 | goto :无条件跳转语句 | ||
unsigned : 无符号类型 | switch :多分支选择结构 | ||
struct :结构体类型 | case :switch语句中的分支 | ||
union :联合体类型 | default :switch语句中的其他分支 | ||
enum :枚举类型 | return :子程序返回语句 | ||
typedef :对数据类型取别名 | |||
sizeof :计算数据类型长度 |
注:在C99标准中还加⼊了 inline 、 restrict 、 _Bool 、 _Complex 、 _Imaginary等等关键字。点击查看关键词
四、字符和ASCII编码
在键盘上可以敲出各种字符,如:a,q,@,#等,这些符号都被称为字符,C语⾔中字符是⽤单引号括起来的,如:‘a’,‘b’,‘@’。
众所周知在计算机中所有的数据都是以⼆进制的形式存储的,而这些字符每一个都被定义了一个二进制序列,这个就叫做编码。
为了⽅便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个标准ASCII 编码,C语⾔中的字符就遵循了 ASCII 编码的⽅式。
常见的ASCII码值如下:
- 字符A~Z的ASCII码值对应 65 ~90。
- 字符a~z的ASCII码值对应 97 ~122。
- ⼤⼩写字符的ASCII码值的差值是32
- 数字字符0~9的ASCII码值对应48 ~57
- 换⾏ \n 的ASCII值对应10
- ASCII码值对应0~31 的32个字符是不可打印字符,⽆法打印在屏幕上。
例如打印字符A,可以直接打印字符,也可以打印其ASCII码值,结果是相同的。
#include<stdio.h>
int main()
{
printf("%c\n", 'A');
printf("%c", 65);
return 0;
}
运行结果:
打印全部字符(128个):
#include<stdio.h>
int main()
{
for (int i = 0; i <= 127; i++)
{
printf("%c ", i);
//一行打印16个字符
if (i % 16 == 15)
{
printf("\n");
}
}
return 0;
}
运行结果:
五、字符串和\0
C语言中使⽤双引号括起来的⼀串字符就被称为字符串,如"abcdef"就是⼀个字符串。
字符串的换行符是%s,也可以直接打印字符串。
#include<stdio.h>
int main()
{
printf("%s\n", "hello world");
printf("hello world");
return 0;
}
运行结果:
可以观察到打印的效果都是一样的。
注意:在字符串的末尾还隐藏着⼀个\0 ,这个\0 是字符串的结束标志。
例如我们要打印字符串abcdef:
#include<stdio.h>
int main()
{
printf("abcdef");
return 0;
}
运行结果:
可以观察到输出的结果是六个字符。
如果我们进行调试:
可以观察到字符串末尾确实还有一个字符‘\0’,但是它不会打印出来,只是作为结束标志。
C语言中也可以将⼀个字符串放在⼀个字符数组中,如下:
#include<stdio.h>
int main()
{
char arr1[] = { 'a', 'b', 'c' };
char arr2[] = "abc";
printf("%s\n", arr1);
printf("%s", arr2);
return 0;
}
我们可以看到,数组arr1打印了 a b c 后还打印了⼀些随机值,这是因为 arr1 没有‘\0 ’作为结束标志,所以在打印的时候没有完全停⽌。而 arr2 打印的内容就是正常的,这是因为arr2中有’\0’作为结束标志。
如果在数组arr1末尾加上‘\0’作为结束标志就可以实现正常打印。如下:
#include<stdio.h>
int main()
{
char arr1[] = { 'a', 'b', 'c', '\0' };
char arr2[] = "abc";
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", "abc\0def");
return 0;
}
可以看到三次打印的结果是⼀样的,字符串都是打印到 ‘\0‘ 的时候就停⽌了。
六、转义字符
在字符中有⼀组特殊的字符是转义字符,转义字符顾名思义:转变原来的意思的字符。
⽐如:我们有字符 n ,在字符串中打印的时候⾃然能打印出这个字符。
#include<stdio.h>
int main()
{
printf("abcndef");
return 0;
}
运行结果:
而使用转义字符后:
#include<stdio.h>
int main()
{
printf("abc\ndef");
return 0;
}
我们可以看到代码修改前后输出的结果是截然不同的。
其实这就是转义字符的作用,\n 这个转义字符是表⽰换⾏的意思,我们可以简单的理解为 \ 让 n 的意思发⽣了转变, n 本来是⼀个普通的字符,被 \ 转义为换⾏的意思。
C语⾔中像这样的转义字符还有许多,点击查看转义字符。
我们讲解下面这几种转义字符:
- \ddd :d d d表⽰1~3个⼋进制的数字。 如: \130 表⽰八进制130所对应ASCII码值的字符:‘X’。
- \xdd :d d表⽰2个⼗六进制数字。 如: \x30 表⽰十六进制30所对应ASCII码值的字符:‘O’。
- 0 :null 字符,代表没有内容, \0 就是 \ddd 这类转义字符的⼀种,用作字符串的结束标志,对应的ASCII码值是0。
代码如下:
#include<stdio.h>
int main()
{
printf("%c\n", '\130');
printf("%c", '\x30');
return 0;
}
运行结果:
七、语句和语句分类
C语⾔的代码是由⼀条⼀条的语句构成的,C语⾔中的语句可为以下五类:
空语句,表达式语句,函数调⽤语句,复合语句,控制语句。
1、空语句
⼀个分号就是⼀条空语句。
#include<stdio.h>
int main()
{
//空语句
;
return 0;
}
空语句⼀般出现的地⽅是:这⾥需要⼀条语句,但是这个语句不需要做任何事,就可以写⼀个空语句。
2、表达式语句
表达式语句就是在表达式的后边加上分号。
int main()
{
int a = 20;
int b = 0;
b = a + 5;
return 0;
}
3、函数调用语句
就是调用函数的语句,后面也有分号。
#include<stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
int ret = Add(2, 3);//函数调用语句
printf("%d\n", ret);
return 0;
}
4、复合语句
一对括号中的代码构成⼀个代码块,也被称为复合语句。
#include<stdio.h>
void print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}//复合语句
}
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 10; i++)
{
arr[i] = 10 - i;
printf("%d\n", arr[i]);
}//复合语句
return 0;
}
5、控制语句
控制语句⽤于控制程序的执⾏流程,以实现程序的各种结构⽅式(C语⾔⽀持三种结构:顺序结构、选择结构、循环结构),C语⾔有九种控制语句。
可分成以下三类:
- 条件判断语句:if、switch。
- 循环语句:for、while、do while。
- 转向语句:break、goto、continue、return。
八、注释是什么?为什么写注释?
注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。
注释是给程序员⾃⼰,或者其他程序员看的。
好的注释可以帮我们更好的理解代码,但是也不要过度注释,不要写没必要的注释。
1、注释的2种形式
C 语⾔的注释有两种表⽰⽅法。
1)/**/ 的形式
第⼀种⽅法是将注释放在 /* */ 之间
如下:
int main()
{
printf("Hello world !")/*Hello world*/
return 0;
}
int main()
{
printf("Hello world !")
/*
Hello world
*/
return 0;
还要注意 /* 开始后,遇到第⼀个 */ 就认为注释结束了。
/*
printf("a ");
printf("b ");
printf("c "); /* 注释二 */
printf("d ");
2) // 的形式
第⼆种写法是将注释放在双斜杠 // 后⾯,这是 C99 标准新增的语法。
// 这是一行注释
int x = 1; // 这也是注释
但是不管是哪⼀种注释,都不能放在双引号⾥⾯。
双引号⾥⾯的注释符号,会成为字符串的⼀部分,解释为普通符号,从而失去注释作⽤。
printf("// hello /* world */ ");
上⾯⽰例中,双引号⾥⾯的注释符号,会被视为普通字符。