%hhd
%lld
%lf
%Lf
scanf() 输入的数据放到标准IO缓冲区
IO缓冲区中的数据如果符合定位符的类型就取出数,如果不符合,那么数就会继续在缓冲区里面,下次再读的时候,又会读到这个数,这就出错了,应该判断scanf的返回值确定是否读数都正确了,如果没有正确,那么就清除掉缓冲区,然后再读
举例:
chara;
scanf(“%d”,&a);
printf(“%d\n”,a);
如果输入23a,那么只会读出23,那个a还是会留在缓冲区里面,这样是不科学的,通过判断来获得符合的数
if(getchar()==’\n’)符合的话,那么输入的数是正确的,而不是截取出来的一段。
清除缓冲区的2种方法:
fflush(stdin) 包含stdlib.h
while(getchar()!=’\n’); 缓冲区都是行缓冲,用换行符来表示结束
变量标识符: 作为左值,那么就代表一片内存
作为右值,那么就代表内存中的值
这可以类比到java的拆箱和装箱
位运算
置位 a |= bit
清零 a &=~bit
多字节类型那么就会涉及到字节序的问题
字节序取决于cpu的类型
输入检验:
由此可以知道,如果超出了最大范围值,这不会溢出的,也就是不是顺序取内存中的值出来,我猜想这scanf应该是有相关逻辑来处理溢出,如果超过了最大或最小值,就取最大值或最小值。
如果是想获取整数值或其他有范围的值,不要直接用相关的类型来存储,而是用字符串数组来存储。并且对字符串进行检验,最后才转换为最终值。
这里的第2题看起来比较简单,其实如果是进行输入检验的话,也是很繁琐的。
6.
char a;
a = ‘\n’;
a = 10 012 0xa
a = ‘\xa’ ‘\x012’