c语言基础day1

**

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 的缓冲三种特性

  1. 全缓冲:在这种情况下,当填满标准 I/O 缓存后才进行实际 I/O 操作。全缓冲的典型代表是对磁盘文件的读写。
  2. 行缓冲:在这种情况下,当在输入和输出中遇到换行符时,执行真正的 I/O 操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的 I/O 操作。典型代表是标准输入(stdin)和标准输出(stdout)。
  3. 不带缓冲:也就是不进行缓冲,标准出错情况 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的个数。输入一个整数(可正可负), 输出该整数的二进制包含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;
}

好好学习!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值