C语言——第二章

时间:2023-02-11 20:04:43

C语言——第二章


一.

在内存中存储定点数时,一般以其最高位(最左边一位)表示数的符号,0表示正,1表示负。数值是以补码形式存放的。一个正数的补码就是该数的二进制数。一个负数的补码我们通过下面的方法求得:
(1)先取该数的绝对值

(2)然后以二进制数的形式存放

(3)再对其取反

(4)然后加1

所有负数的二进制补码的最高位必然为1.

显然,无符号的正数的最大值约为有符号的正数的最大值的两倍再加1(因为补码有正0和负0)。在C语言中,实数(浮点型)都是有符号的,不可以使用无符号修饰符。


二.

常用数据类型的长度:(1B = 8bit

char:1B

short:2B

int:4B

long:4B

float:4B

double:8B

long long:8B


三.

字符类型的数据在内存中是以相对应的ASCII码存放。


四.

打印人民币符号printf("Y\b=\n");控制代码"\b"使打印头退回一格,回来打印好的Y位置再打印字符“=”,两个字符重叠形成人民币符号。当然,这一输出只能在打印机上实现,而不能在显示器上实现。因为显示器没有重叠显示功能。


五.

对一格变量进行显示转换后,得到另外一格类型的数据,但原变量的类型不变。


六.

Printf()函数一般形式如下:

int printf(格式控制字符串,输出表达式1,输出表达式2...);

格式控制字符串由两部分组成:格式说明字段和普通字符。普通字符(包括转义符序列)将被简单的复制并显示。一个格式说明字段将引起一个输出参数项的转换与显示,它是由"%"引出的格式说明字段。格式说明字段与后面的输出表达式参数要对应一致。

%     前缀修饰          域宽        精度            长度修正符          格式码

       -0+,空格,#  十进制整数   十进制整数     

需要指出的是:输出数据的实际精度并不主要取决于格式说明字段中的域宽和精度,也不取决于输入数据的精度,而主要取决于数据在机器内的存储精度。例如,一般C语言系统对float数据只能提供6为有效数字。格式说明字段中所指定的域宽再大,精度再长,得到的多余位数上的数字是毫无意义的。所以,增加域宽与精度并不能提高输出数据的实际精度。


七.

当年困扰自己的一个问题

#include<stdio.h>

int mian(void)

{

Int a = 1, b = 2;

Printf("x = %d, y = %d\n", ++a + b, ++b + a);

Return 0;

}

程序执行结果为x = 5, y = 4

原因在于printf()函数中输出表达式的运算顺序是由右向左的。但是应注意此规则会因编译程序的不同而不同。所以,我们尽量确保在输出时,输出表达式不能相互影响,要确实是一个固定的值。


八.

在输入数据时,实际上并非输入一个数据项就送给一个变量,而是在输入一行字符并按enter键之后才被输入,这一行字符先存放在一个缓冲区内,然后按照scanf()格式说明的要求从缓冲区中读取数据,如果输入数据多于一个scanf()锁要求的个数,那么余下的数据将作为下一个scanf()接着使用。为了保持输入的一致性,可以在格式串中的不同类型转变处添加显式的空白。scanf("%d %c %c %d %lf", &num, &name, &sex, &age, &salary);

当定义中有字段宽度时,scanf()将在缓冲区中的输入流上,按照宽度有间隔的挑取字符。

scanf("%3c%3c", &c, &d); 如果我们输入为abcd,那么c=a, d=d;


九.

在执行getchar()时,虽然是每次读入一个字符,就回显一个字符,但并非从键盘输入一个字符,该字符就立即送给一个字符变量,而是等到按Enter后,才将一行字符输入缓冲区,然后getchar()函数从缓冲区中取一个字符送给一个字符型变量。这种情况成为行缓冲。