**
1. VS调试时查看内存
**
i 的值变为 7b(我们查看内存以 16 进制方式),其十进制值为 7*16+11=123。i 的值是 0x0000007b,为什么显示
效果为 7b 00 00 00 呢,是因为英特尔的 CPU 为小端存储,所以低位在前,高位在后。
scanf中遇见的问题
#include "stdio.h"
#include "conio.h"
using namespace std;
main()
{
//printf("123\b456");
float f;
double d;
int ret=scanf("%f%f",&f,&d);
printf("%5.2f\n%f",f,d);
getch();
}
如果d的输入格式为%f,那么它的高四个字节不会初始化
,输出时照样会按8字节输出。至于如何输出参考IEEE-754 存储标准
scanf连续输入时(%c不会忽略空格和\n)
缓C 的缓冲三种特性
- 全缓冲:在这种情况下,当填满标准 I/O 缓存后才进行实际 I/O 操作。全缓冲的典型代表是对磁盘文件的读写。
- 行缓冲:在这种情况下,当在输入和输出中遇到换行符时,执行真正的 I/O 操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的 I/O 操作。典型代表是标准输入(stdin)和标准输出(stdout)。
- 不带缓冲:也就是不进行缓冲,标准出错情况 stderr 是典型代表,这使得出错信息可以直接尽快地显示出来。
前两种情况可以使用fflush()手动刷新缓冲区,但是在vs2013后使用rewind();
ANSI C( C89 )要求缓存具有下列特征:
1)当且仅当标准输入和标准输出并不涉及交互设备时,它们才是全缓存的。
2)标准出错决不会是全缓存的。
图 2.9.1-1 的例子,我们往标准输入缓冲中放入的字符为 20\n,当我们输入了\n(回车)
后,scanf 才开始匹配,scanf 的%d 匹配整型数 20,然后放入变量 i 中,我们进行打印输出,这时候\n,仍然在标准输入缓冲区(stdin)内,如果第二个 scanf 为scanf("%d",&i),那么依然会发生阻塞,因为 scanf 在读取整型数,浮点数,字符串(到后面数组讲解字符串)时,才会忽略\n(回车),空格等字符。scanf 匹配一个字符,就会在缓冲区删除对应字符。
如果我们想输入多个整数(每次输入都回车),让 scanf 读取后,并打印输出,那么我们需要一个 while 循环(如果对 while 循环完全没概念,跳过本节,学完第三
章以后,再来看本节),为什么要加入 fflush(stdin)呢,因为 fflush 具有刷新(清空)标准输入缓冲区的作用,如果我们输错了,输入的为字符,scanf 无法匹配成功,scanf 没有匹配成功其返回值为 0,也就是 ret 的值为 0,但是并不等于 EOF,因为 EOF 的值为-1,仍然会进入循环,就会造成不断的打印,而我们的实际执行结果如图 2.9.2-2,最后我们输入 ctrl+z,让scanf 匹配失败,循环结束。各位小伙伴可以自行尝试,去除 fflush(stdin),然后输入 a,看
效果。
运算符的妙用
异或运算的两个应用:
1.int A[]={1,2,3,2,1};找出单独的数
2.交换两个数a,b.(优点:不用担心溢出)
位运算的应用:
1.找出数a为1的最低位 a&(-a)
今天被虐爆的两段代码
- 统计一个整数对应的二进制数的1的个数。输入一个整数(可正可负), 输出该整数的二进制包含1的个数, “ctl+ z” 结束。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = -1;
while (scanf("%d", &i) != EOF) {
int num = 0;
i < 0 && num++;
i = (i >= 0) ? i : ~(1 << 31) & i;
while (i != 0) {
i & 1 && num++;
i = i >> 1;
}
printf("%d\n", num);
}
system("pause");
return 0;
}
2. 从键盘上输入字符,(1)分别统计一下其中字母,数字,其他字符的个数, (2)将统计的字母,数字,其他字符的个数以柱状图的形式打印。例如
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main()
{
int ct[3] = { 0 };//alp, num, oth;
char c;
while (rewind(stdin), scanf("%c", &c) != EOF)
isalpha(c) ? ct[0]++ : isdigit(c) ? ct[1]++ : ct[2]++;
for (int m = (ct[0] > ct[1]) ? ct[0] : (ct[1] > ct[2]) ? ct[1] : ct[2];
m >= 0; m--){
for (int i = 0; i < 3; i++)
if (m == ct[i])
printf("%3d ", m);
else if (m < ct[i])
printf("***** ");
putchar('\n');
}
printf(" alp num oth\n");
system("pause");
return 0;
}
好好学习!