C语言专业总结
1.基础语法
(1)输出Hello World
#include <Stdio.h> int main(){ printf("Hello World\n"); return 0; }
C |
C语言风格代码 |
头文件包含 |
#include <Stdio.h> |
输出HelloWorld |
printf("Hello World"); |
解析:
头文件stdio中包含输入输出函数,scanf和printf函数,此外还有很多其他函数
int main() 代表的是主函数,是一个程序比不可少的一部分,依次分为返回值类型,名字,参数,
返回值类型代表这个函数想要返回的数的类型,如float(单精度),double(双精度),short int(短整型)对应的也有long int(长整型)或long long int(长长整型) ,char(字符型),等等
其中参数这里默认为空,为形参,调用的是实参,这些会在函数章节讲到.
return 0; 代表是返回0代表程序结束,或者可以为一个特定值,如return 2;代表返回一个整数2,返回的含义也同样会在函数中讲到,暂且理解为给程序返回一个数0,代表结束程序
(2)变量名起名规范
变量也成为标识符,是存储数据的一个容器,如 int a = 5;定义了一个变量名a,存放了一个整型5.同时也定义为了整型变量
(1)变量名是由字母,数字,下划线构成的
(2)不能是数字开头如:123number
(3)数据类型
判断数据类型所占字节大小可以用sizeof()函数判断
如(此处就只写语句了,基本语句请自打)
int a; printf("%d",sizeof(a));
输出结果为4,所以得知int类内存字节大小为4,即编译器在内存空间开辟了4个字节大小的空间供a变量使用
数据类型可分为两类:数值类和非数值类(字符型等等),其中还有一个特殊的类型,bool(布尔类型),我们在下面会说到
数值型:
int ,short int ,long int ,long long int ;
float ,double(此两种可理解为小数点型,float为单精度,double为双精度)
问:如果一个数1.3,他的数据类型是什么呢?---注意此处只是打个比方,实际中1.3应该赋值给一个变量,通常我们用 double型
答:默认是为double类型的,如果你想要强制类型转换为float类型,你可以用(float)1.3或1.3f都可以转换为单精度型
强制转换特别说明:
如果你想要将一个占用字节数小的数据类型转为占用字节数大的数据类型是没有的问题的,
如:原本是short int 类型(2字节)转int(4字节)是没有问题的
但是当你将一个占用字节数大的数据类型转为一个占用字节数小的数据类型可能会发生错误
如:double(8字节)->float(4字节)就可能有错误发生.
下面是代码演示:将一个整型转为浮点型数据
#include <stdio.h> int main() { int a = 5; printf("%lf", (double)a); return 0; }
输出结果为:
可以清楚看到变为了双精度数据类型了
非数值型
char 即字符型
赋值方法:
char ch = 'a';
此时ch是一个字符变量,它存储一个字符数据a。
注意区分a与‘a’的区别,后者才是字符,采用的是ASCII编码。
bool类型
C语言本身里面没有专门的bool类型,C++里面才有。在C99标准还没出来时,是用整数0代表“假”,1代表“真”。
在C99中提供了_Bool类型
赋值方法:
_Bool b;//声明一个布尔型变量 //布尔型实际是一个无符号整型(指的是0和正整数,没有负整数),因此布尔型变量实际上就是整型变量,但是与普通的整型变量不同,因为布尔型变量只能赋值为0或1(假或真). b = 0; printf("%d\n",b);//显示0,表示假。 b = 8; printf("%d",b);//虽然赋值为8,但是只要是非零值在布尔类型眼里就是1,所以显示1,表示真
C99中还提供了一个stdbool.h头文件,能让我们操作布尔值更容易。该头文件中用bool来代替_Bool,还提供true和false两个宏,分别代表1或0(真或假)
#include <stdbool.h> int main(){ bool a; a = false; printf("%d",a);//显示0,表示假 a = true; printf("%d",a);//显示1,表示真 }
(4)标准输入输出
标准输入
特别说明:如果你也用的是VS,有可能你用scanf并且你的文件拓展名是cpp时(此为C++文件拓展名)可能会报错,有以下几种解决方法
- 解决方法 在头文件下宏定义一个值 即
#define _CRT_SECURE_NO_WARNINGS
- 解决方法 用.c的文件拓展名即可.
- 右击项目,选择属性,在c/c++中在其他选项中输入 /D_CRT_SECURE_NO_WARNINGS 即可
如图
标准输入格式scanf("%xxx",&变量名);
&为取地址运算符,是必不可少的
其中xxx代表的只是你想键入的数据类型而已,变量名即你想存放的容器的名称.
比如我不想以后给整型变量a和双精度变量b每次赋初始值,我想手动输入。
代码为:
#include <Stdio.h>int main() { int a = 5; double b; scanf("%d%lf", &a, &b); printf("%lf\n",(double)a); printf("%f",b); return 0; }
结果为:
注意点:声明了一个整型变量那么输入的类型也应该一致!
常用格式符 |
含义 |
%d |
整型int |
%f |
单精度浮点型float |
%lf |
双精度浮点型double |
%c |
字符型char |
%s |
字符串型(由若干个字符构成的序列)string |
%o |
以八进制形式输入整数 |
%x或%X |
以十六进制形式输入整数 |
%g或%G |
以小数或指数形式输入浮点数 |
特殊输入格式(不推荐)
#include <Stdio.h> int main() { int a = 5; double b; scanf("a=%d,b=%lf", &a, &b); printf("%lf\n",(double)a); printf("%f",b); return 0; }
可以清楚看到,你必须要将前面的字符一个个打出来才能正常显示出来,不然会有意想不到的结果出现,当然这种输入格式并不推荐
输出格式
完整输出格式
% 标志 最小字段宽度 精度 修饰符 格式符
printf("%d",n);//其中双引号中的内容可以是上面的内容,n为你想输入的变量名(当然也可以是表达式,不过有多个关于同个变量名的表达式需要注意,请学到自增运算符时注意此种情况的说明).
其中格式符时最为重要的!
% |
就是个占位符的作用 |
标志 |
-,+,# |
最小字段宽度 |
见解析 |
精度 |
见解析 |
修饰符 |
h(短整型),l(长整型),ll(长长整型),L(长双精度型) |
格式符 |
上节以说 |
标志详细说明
标志 |
含义 |
- |
输出时靠左对齐 即贴紧左边窗口 (啥都不带时默认是左对齐)与最小字段宽度搭配效果明显 |
+ |
这并不是强制右对齐的意思了,而是让你输出的数如果是正数则在前面带个+号,负数带个-号,与平常输出差别主要在于正数,负数无太大去呗 |
# |
输出八进制数时以0开头,输出十六进制以0x或0X开头,浮点数始终有小数点,保留以格式g或G输出的数的尾部零 |
最小字段宽度的含义
它指定了数据输出的宽度,如果你所输入的数据太小无法达到这一宽度,则会用空格进行填充,如果数据太大超过了这一宽度,则会按原样输出.如果宽度为*,表示宽度由输出项指明.
以下代码将-标志与最小字段宽度结合使用
#include <Stdio.h> int main() { printf("%d\n", 123); //最小字段宽度 printf("%5d\n", 123); //-标志与最小字段宽度的结合(多出来的两个空格仍然存在) printf("%-5d\n", 123); printf("%-5d%-5d\n", 123, 456); return 0; }
结果:
以下代码将+标志与最小字段宽度结合使用
#include <Stdio.h> int main() { printf("%d\n", 123); //最小字段宽度 printf("%5d\n", 123); //+标志与最小字段宽度的结合 printf("%+5d\n", 123); printf("%+5d%+5d\n", 123, 456); printf("%+5d%+5d\n", 123, -456); return 0; }
结果:
以下代码将最小字段宽度与#标志与格式符结合使用
#include <Stdio.h> int main() { printf("%d\n", 123); //最小字段宽度与格式符结合使用 printf("%5d\n", 123); printf("%5o\n", 123); printf("%5x\n", 123); printf("%7g\n", 123.51);//123.51占了6位,包括小数点 //最小字段宽度与#标志与格式符结合使用 printf("%#5o\n", 123); printf("%#5x\n", 123); printf("%#5g\n", 123.515); return 0; }
结果为:
精度含义:精度的含义依赖于运算符,实际中我们用的最多的即于f,或lf一起搭配使用了
%.xxf或%.xxlf都是常用的,xx代表你想输入的数字
#include <Stdio.h> int main() { printf("%d\n", 123); printf("%.2f", 123.123); return 0; }
结果为
123
123.12
即后面指挥让他小数点后xx位输出出来
修饰符(不常用)
修饰符 |
常用修饰的格式符 |
含义 |
h |
d,o,x,X |
短整型(short) |
l |
d,o,x,X |
长整型(long) |
ll |
d,o,x,X |
长长整型(long long) |
L |
f,e,E,g,G |
长双精度型(long double) |
(5)运算符
常用运算符
优先级表
按优先级排序(即运算时最先执行那一部分)
优先级 |
运算符名称 |
运算符 |
1 |
括号运算符 |
( ) |
1 |
下标运算符 |
[ ] (用于数组) |
1 |
自增运算符(后缀) |
++ |
1 |
自减运算符(后缀) |
-- |
2 |
自增运算符(前缀) |
++ |
2 |
自减运算符(前缀) |
-- |
2 |
地址运算符 |
& |
2 |
指针运算符(之后会将) |
* |
2 |
正号运算符 |
+ |
2 |
负号运算符 |
- |
2 |
逻辑运算符 |
!(取反) |
4 |
算术运算符 |
* ,/ ,%(取余) |
5 |
算术运算符 |
+,- |
7 |
关系运算符 |
<,>,<=,>= |
8 |
关系运算符 |
==(等于),!=(不等于) |
12 |
逻辑运算符 |
&& |
13 |
逻辑运算符 |
|| |
14 |
条件运算符 |
? :(三元运算符) |
15 |
赋值运算符 |
**=,=,/=,%=,+=,-=,<<=,>>=,&=,^=,!= |
解析:
自增运算符:
重点注意!!!
其中多个关于同个变量名的表达式的输入顺序是不一样的.
#include <Stdio.h> int main(){ int n = 1,m = 2; int count = 0; //后是结果 printf("%d%d",n,m);//1,2 printf("%d %d %d",count++,count++,count++);//2 1 0 }
这是可能会有读者不理解,为什么不是0 1 2,根据函数调用原则,最后的参数先进栈(可以理解为存放一个局部变量的容器),即通俗的说就是从右往左进行运算赋值。所以就是为什么 2 1 0 的原因了.
假设一个变量a,
++a,--a都等价于a += 1,a=a+1,a -= 1.a = a -1
而a++,a--,其实是指先将a本身的值先用掉(例如赋值给b,或输出等等),再加1或减1
#include <Stdio.h> int main() { int a = 1; printf("%d\n", a++); printf("%d\n", a); printf("%d", ++a); return 0; }
结果:
1
2
3
先输出a本身的值1,再加1
为2了,再输出,
再加1,输出,为3了
取余运算符%与整除运算符/
整除运算符
在C语言中如果直接将两个整数相除,得到的是他们取整的部分,如果你想要小数部分,你需要将相除的两个数或任意一个变为浮点数,输出类型也与之对应即可,如下列代码
取余运算符,即取出两数整除的余数部分.
#include <Stdio.h> int main() { int a = 5; printf("%d\n", a / 2); printf("%f\n", a / 2.0); printf("%d\n", a % 2); return 0; }
结果:
2
2.500000
1
关系运算符(返回值是0或1)
重点是==,!=的概念
这与数学中的=不同,应该C中的=已经被用于赋值了,所以为了避免混淆,采用了==的方式表达,输出的值是1(真)即两个数相等,或0(假,两个数不相等)
!=即不相等,输出的值与==相同,只是它是两个数真的不相同的时候输出1,两个数相同得到时候为假输出0
如5 != 5 是0,翻译成话,就是5不等于5? 错0
7 == 7 是1 7等于7? 对1
逻辑运算符(返回值是0或1)
!(取反),&&(与),||(或)
例如
int a = 5,b = 4; int c = 0;
a && b 其实就是判断两边的数是否都为真即都不为0,
c && b 如果两者有1个为0,,最后结果就是0
a || c 两者之中只要有1个数为1,最后结果就是1,两数都为0,结果也为0
!a 取反操作即如果你数不是0,取反之后数就是0
!c 原本的数是0,取反之后就是1
注意!!!:C语言中这里有陷阱,
&& 情况
例如a && b,如果a为0,那么右边的表达式时不会执行的(C语言:你左边都是0了,整体肯定是0,还算右边干嘛)
比如 a为0的情况下,a && ++b 执行之后,输出0,之后想看看b的值,这时b的值还是4,不会是5
|| 情况
例如a || b,如果a为1,那么右边的表达式时不会执行的(C语言:你左边都是1了,整体肯定是1.还算右边干嘛)
比如 a为1的情况下,a || ++b 执行之后,输出1,之后想看看b的值,这时b的值还是4,不会是5
#include <Stdio.h> int main() { int a = 5,b = 4; int c = 0; //注释是结果 printf("%d\n", a && b);//1 printf("%d\n", c && b);//0 printf("%d\n", a || c);//1 printf("%d\n", !a);//0 printf("%d\n", !c);//1 return 0; }
三元运算符
元代表一个表达式,顾名思义有3个表达式
表达式1?表达式2:表达式3
表达式1的结果要是一个bool值,即真或假,如果为真则执行表达式2,如果为假,则执行表达式3
读者可以自行理解一下,还可以有嵌套结构,如果a>b则执行嵌套中的,否则为3
#include <Stdio.h> int main() { int a = 5,b = 4; int c = 0;//注释是结果 printf("%d\n", a > b ? 123 : 456);//123 printf("%d\n", c > b ? 123 : 456);//456 printf("%d\n", a > b ? (a > c ? 1 : 2) : 3);//1 return 0; }