C语言知识点笔记1

223 阅读5分钟

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 的简写。

image.png %-9d中,d表示以十进制输出,9表示最少占9个字符的宽度,宽度不足以空格补齐,-表示左对齐。综合起来,%-9d表示以十进制输出,左对齐,宽度最小为9个字符。

数据类型

每一种类型的字节数在C语言中都是固定的,知道了数据类型,也就知道了数据长度。

说明字符型短整型整型长整型单精度字符串双精度字符串
数据类型charshortintlongfloa tdouble
长度124448
  • 如果不希望设置符号位,可以在数据类型前面加上 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--;也是如此。

image.png

从键盘输入字符和字符串

C语言有多个函数可以从键盘获得用户输入,它们分别是:

  • scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
  • getchar()、getche()、getch():这三个函数都用于输入单个字符。
  • gets():获取一行数据,并作为字符串处理,所以gets() 能读取含有空格的字符串,而 scanf() 不能。

笔记整理自:c.biancheng.net/c/32/ c语言中文网