您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
008第三章 顺序程序设计02
发布时间:2021-04-08 22:14:48编辑:雪饮阅读()
Printf的特性
先看一个奇怪的程序
那按照这个代码的逻辑来看,且不说其它结果,就第一行结果应该是9,毕竟先自加。
但是实际结果与我们所理解的结果有出入,这是因为printf打印顺序是先进后出原则。
也就是这里所接收到的参数值队列,从最后一个向最前面进行计算。
那么顺序如下:
-i--:-8(因为后减)
-i++:-8(因为后加),上面的结果影响不到这里(个人理解:所有后操作的,只能影响到下一个语句,也就是说在当前这个printf中是不会计入的。)
i--:8(因为后减):
i++:8(因为后减)
--i:7(因为先减)
++i:8(虽然是先加,但是上面的先减影响到了i本身的值)
那么printf这个机制理解之后,则下面这个程序的答案就显而易见了。
#include <stdio.h>
void main(){
int i=8;
printf("%d",-i--);
printf("%d",-i++);
}
结果就是:-8-7
Scanf参数的分隔符与接收类型
Int型的空格与换行做为默认分隔符
#include <stdio.h>
void main(){
int a,b,c;
printf("input a,b,c\n");
//输入3个参数时必须以空格或换行做为分隔符,并且必须输入int型
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d",a,b,c);
}
Scanf参考值必须是引用类型
#include <stdio.h>
void main(){
int a,b,c;
printf("input a,b,c\n");
//scanf接收的参考值必须是引用类型,比如这里参考值a,若是在以前老的系统中就会直接抛出未初始化的异常
//在新的系统中会在接收到第一个输入值之后进行下个值的输入时崩溃掉(闪退)
scanf("%d%d%d",a,&b,&c);
printf("%d,%d,%d",a,b,c);
}
字符型Scanf无分隔符的分隔符
#include <stdio.h>
void main(){
char a,b;
printf("input a,b\n");
scanf("%c%c",&a,&b);
printf("%c,%c\n",a,b);
}
这里在输入的时候需要连续输入ab,而不是输入a空格b,也不是输入a回车b。
自定义int型输入格式于scanf
#include <stdio.h>
void main(){
int a,b;
printf("input a,b\n");
scanf("%d,%d",&a,&b);
printf("%d%d\n",a,b);
}
这里定义了英文逗号做为int输入型的分隔符。
这里输入的时候就不能用默认的回车或者空格做为int输入的分隔符了,必须要以英文逗号做为输入int的分隔符了。
以上种种在这里可以总结未scanf的第一个参数是接收一个输入格式,第二个开始的参数都是各参考值的引用。
利用输出格式化以及类型转换的原理实现小写字母转大写字母
这里实现一个逻辑,输入3个小写字母,对应输出这3个小写字母的ascall码以及对应的大写字母
#include <stdio.h>
void main(){
char a,b,c;
printf("input a,b,c\n");
scanf("%c %c %c",&a,&b,&c);
printf("%d %d %d\n %c %c %c\n",a,b,c,a-32,b-32,c-32);
}
首先这个接收的3个字母肯定都是char类型,char类型转换为int类型正好就是char类型对应的ascall码赋值于int类型的低8位。由于int类型存储范围比较大,所以这个值就可以完全表达出来。Ascall码最大也才十进制127.。
那么观察ascall码表可以发现大小写之间,特别是大写比小写差了32个值,所以直接也可以用char类型的小写字母减去32(不同类型会隐式自动转型到大类型,这里32是int型大类型)。然后再将减去32之后的结果按char类型输出则就是对应的大写字母了。
关键字词:c,c语言,顺序程序