C语言知识点笔记1
补码表示法
假设,一个十进制数为n,模为mod。
- 如果n为正数,n的补码为n的二进制。
- 如果n为负数,n的补码为mod-|n|的二进制。
- 例如2的补码为010;-2的补码为mod-2=8-2=6(假设模为8),也就是110.
格式化输出
- %d, 用来输出十进制整数。
- %f, 用来输出实数(包括单,双精度),以小数形式输出,默认情况下保留小数点6位。
- %c, 用来输出一个字符,character。
- %s, 用来输出一个字符串,string。
%hd用来输出 short int 类型,hd 是 short decimal 的简写;%d用来输出 int 类型,d 是 decimal 的简写;%ld用来输出 long int 类型,ld 是 long decimal 的简写。
%-9d中,d表示以十进制输出,9表示最少占9个字符的宽度,宽度不足以空格补齐,-表示左对齐。综合起来,%-9d表示以十进制输出,左对齐,宽度最小为9个字符。
数据类型
每一种类型的字节数在C语言中都是固定的,知道了数据类型,也就知道了数据长度。
| 说明 | 字符型 | 短整型 | 整型 | 长整型 | 单精度字符串 | 双精度字符串 |
|---|---|---|---|---|---|---|
| 数据类型 | char | short | int | long | floa t | double |
| 长度 | 1 | 2 | 4 | 4 | 4 | 8 |
- 如果不希望设置符号位,可以在数据类型前面加上 unsigned 关键字,例如:
unsigned short a = 12
这样,short、int、long 中就没有符号位了,所有的位都用来表示数值,正数的取值范围更大了。这也意味着,使用了 unsigned 后只能表示正数,不能再表示负数了。
请注意一个小细节,如果是unsigned int类型,那么可以省略 int ,只写 unsigned
-
小数有一种更加智能的输出方式,就是使用
%g。%g 会对比小数的十进制形式和指数形式,以最短的方式来输出小数,让输出结果更加简练。所谓最短,就是输出结果占用最少的字符。 -
一个数字,是有默认类型的:对于整数,默认是 int 类型;对于小数,默认是 double 类型。如果不想让数字使用默认的类型,那么可以给数字加上后缀,手动指明类型:
在整数后面紧跟 l 或者 L(不区分大小写)表明该数字是 long 类型; 在小数后面紧跟 f 或者 F(不区分大小写)表明该数字是 float 类型。
转义字符
-
对于转义字符来说,只能使用八进制或十六进制
-
转义字符的初衷是用于ASCII码
-
\n用来换行,让文本从下一行的开头输出 -
\t用来占位,一般相当于四个空格,或者 tab 键的功能
单引号、双引号、反斜杠是特殊的字符,不能直接表示:
- 单引号是字符类型的开头和结尾,要使用
\'表示(也即'\''); - 双引号是字符串的开头和结尾,要使用
\"表示(也即"abc\"123"); - 反斜杠是转义字符的开头,要使用
\\表示,也即'\\',或者"abc\\123"。
标识符
标识符就是程序员自己起的名字,除了变量名,后面还会讲到函数名、宏名、结构体名等,它们都是标识符。不过,名字也不能随便起,要遵守规范;C语言规定,标识符只能由字母(AZ, az)、数字(0~9)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。
以下是合法的标识符:
a, x, x3, BOOK_1, sum5
以下是非法的标识符:
- 3s 不能以数字开头
- sT 出现非法字符
- -3x 不能以减号(-)开头
- bowy-1 出现非法字符减号(-)
自增++和自减--
自增自减的结果必须得有变量来接收,所以自增自减只能针对变量,不能针对数字,例如10++就是错误的。
需要重点说明的是,++ 在变量前面和后面是有区别的:
-
++ 在前面叫做前自增(例如 ++a)。前自增先进行自增运算,再进行其他操作。
-
++ 在后面叫做后自增(例如 a++)。后自增先进行其他操作,再进行自增运算。
自减(--)也一样,有前自减和后自减之分。
下面的例子能更好地说明前自增(前自减)和后自增(后自减)的区别:
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30, d = 40;
int a1 = ++a, b1 = b++, c1 = --c, d1 = d--; printf("a=%d, a1=%d\n", a, a1);
printf("b=%d, b1=%d\n", b, b1);
printf("c=%d, c1=%d\n", c, c1);
printf("d=%d, d1=%d\n", d, d1);
return 0;}
输出结果:
a=11, a1=11
b=21, b1=20
c=29, c1=29
d=39, d1=40
a、b、c、d 的输出结果相信大家没有疑问,下面重点分析a1、b1、c1、d1:
1.对于a1=++a,先执行 ++a,结果为 11,再将 11 赋值给 a1,所以 a1 的最终值为11。而 a 经过自增,最终的值也为 11。
2.对于b1=b++,b 的值并不会立马加 1,而是先把 b 原来的值交给 b1,然后再加 1。b 原来的值为 20,所以 b1 的值也就为 20。而 b 经过自增,最终值为 21。
3.对于c1=--c,先执行 --c,结果为 29,再将 29 赋值给c1,所以 c1 的最终值为 29。而 c 经过自减,最终的值也为 29。
4.对于d1=d--,d 的值并不会立马减 1,而是先把 d 原来的值交给 d1,然后再减 1。d 原来的值为 40,所以 d1 的值也就为 40。而 d 经过自减,最终值为 39。
可以看出:a1=++a;会先进行自增操作,再进行赋值操作;而b1=b++;会先进行赋值操作,再进行自增操作。c1=--c;和d1=d--;也是如此。
从键盘输入字符和字符串
C语言有多个函数可以从键盘获得用户输入,它们分别是:
- scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
- getchar()、getche()、getch():这三个函数都用于输入单个字符。
- gets():获取一行数据,并作为字符串处理,所以gets() 能读取含有空格的字符串,而 scanf() 不能。
笔记整理自:c.biancheng.net/c/32/ c语言中文网