一. 格式化输出
1.数据类型格式化
1)整数 对于int而言,利用%d将要输出的内容进行格式化,然后输出。%lld用于对longlong类型的变量进行格式化
#include<stdio.h>
int main ()
{
int pp=23;
long long ww=19970911;
printf("pp is %d,ww is %lld\n",pp,ww);
return 0;
}
2)浮点数 对于浮点数而言,利用%f来对单精度浮点数float进行格式化;用%lf来对双精度浮点数进行格式化。并且用 . 加数字来表示要输出的数字精确到小数点后几位。
#include <stdio.h>
int main ()
{
float f=3.1415926;
double df=12300.22;
printf("f is %.4f,df is %.0lf\n",f,df);
return 0;
}
3)字符 对于字符而言,用%c
来进行格式化,C语言中的字符是用单引号引起来
#include <stdio.h>
int main ()
{
char pp='B';
printf("%c\n",pp);
return 0;
}
4)字符串 由多个字符组合而成,用双引号引起来,用%s
进行格式化
#include <stdio.h>
int main()
{
char str[100] = "I love you!";
printf("%s\n", str);
return 0;
}
2.对齐格式化
1)负号:如果有,则按照左对齐输出;
2)数字:指定字段最小宽度,如果不足则用空格填充;
3)小数点:用与将最小字段宽度和精度分开;
4)精度:用于指定字符串重要打印的而最大字符数、浮点数小数点后的位数、整型最小输出的数字数目;
整数的格式化输入
scanf含义为:Scan和Format
1.单个数据的输入
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
printf("%d\n", a);
return 0;
}
1314↙
1314
其中↙代表回车,即我们通过键盘输入1314,按下回车后,在屏幕上输出1314。
类比输出,我们发现,输入和输出的差别在于:
( 1 ) 函数名不同;
( 2 )输入少了换行符 \n;
( 3 )输入多了取地址符&;
————————————————
版权声明:本文为CSDN博主「英雄哪里出来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/WhereIsHeroFrom/article/details/118739504
多个数据的输入可以放置在同一语句中,切记加上&
空格免疫,输入一个或者多个空格不会影响输入
回车结算:scanf()是以回车结算一次输入的
字符串的输入:字符串的输入不需要加&
一定要做到格式的一致性,才能够完成数据的匹配,否则会造成显示初始赋值,或不显示
进制在c语言中表示:
二进制:用0b
作为前缀,然后跟上0
和1
组成的数字
八进制:前缀1个0
,然后跟上0-7
的数字
十六进制:以0x
或者0X
作为前缀,跟上0-9
、a-f
、A-F
的数字,其中大小写字母的含义相同,分别代表从10
到15
的数字
ASCII码(ask2码)
ASCII 码的输出:ASCII 码对应的字符用单引号括起来,并且是可以按照两种方式来输出的,分别为:字符形式 和 整数形式
ASCII 码的运算
字符加上一个数字,我们可以认为是对字符编码进行了一个对应数字的偏移,字符'0'
向右偏移 5 个单位,就是字符'5'
;同样的,'A'
向右偏移3个单位,就是字符'D'
运算时:注意输出的形式,是字符还是整数,避免自己犯错
数值常量分为整数和浮点数,整数一般称为整型常量,浮点数则称为实型常量。
后缀,u
(unsigned
)代表无符号整数,l
(long
)代表长整型,ll
代表long long
。
实型常量
1.小数形式 如:3.1415 3.1f .569(f代表后缀 float用于区分double)
2.指数形式 如:3e-5 1.1e6
每个字符都对应一个 ASCII 码值
转义字符
转义字符是用引号引起来,并且内容为 斜杠 + 字符,例如我们之前遇到的用 '\n'代表换行,\t代表水平制表符(可理解为键盘上的 tab 键),'\\'代表一个反斜杠,等等;
当然还可以用 '\ooo'来代替一个字符,其中一个数字o代表一个八进制数;也可以用 '\xhh'来代表一个字符
————————————————
版权声明:本文为CSDN博主「英雄哪里出来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/WhereIsHeroFrom/article/details/118739504
1.#define 进行预处理,用来代替。
PP将会被替换为想要飞上天
#define PP "想要飞上天"
2.const 在普通变量定义前加上const
,这样就代表它是个常量了,在整个运行过程中都不能被修改
#include <stdio.h>
const int pp = 5;
int main() {
printf( "%d\n", pp );
return 0;
}
算术运算符(除法)
1)当 除数 和 被除数 都是整数时,运算结果也是整数;
1.a)如果能整除,结果就是它们相除的商;
1.b)如果不能整除,那么就直接丢掉小数部分,只保留整数部分,即数学上的 取下整;
2)除数和被除数中有一个是小数,那么运算结果也是小数,并且是 double 类型的小数。
————————————————
版权声明:本文为CSDN博主「英雄哪里出来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/WhereIsHeroFrom/article/details/118739504
注意:特别注意 除零错 ,编译器无法识别出错误,只能在编译时注意避免。
取余符号:取余符号即求余数,符号为%,取余只针对整数,所以%两边只能为整数,不可以出现小数,否则会出现编译错误。(余数可以是正数也可以是负数,由%
左边的整数决定)
算数运算符的优先级高于赋值运算符
例如:4%3=1 9%6=3
而%
在printf
中是用来做格式化的,所以想要输出到屏幕上,需要用%%
。
#include <stdio.h>
int main()
{
printf(
"9%%4=%d\n"
"-9%%4=%d\n"
,
9%4,
-9%4,
);
return 0;
}
自增与自减 (这里只解释自增)
前自增表达式:++i的值,是i加1后的值 。 即先加1后引用,先将变量加1,然后在引用加1后的值
例如:若i=8;k=++i 则i=9 k=9
后自增表达式:i++的值,是i加1之前的值。即先引用后加1,先引用变量的值,然后在对变量的值加1
例如:若i=8;k=i++ 则i=9 k=8
若存在-i++,则-(i++) 因为后自增优先于取负运算符
关系运算符
关系运算符的两边可以是变量、数值 或 表达式
如:a > b ,3 > 5 , a + b > 4
关系运算符的应用
1.运算结果 关系运算符的运算结果只有 0 或 1。当条件成立时结果为 1,条件不成立结果为 0。
2.运算符嵌套 即运算的结果可以继续作为关系运算符的运算参数
#include <stdio.h>
int main() {
printf("%d\n", 1 > 10000> -1);
return 0;
}
其结果为:1
因为:1 >10000
的结果为0
,所以1 >10000> -1
等价于0 > -1
3.运算符优先级
!=和==的优先级低于>,<,>=,<=。
逻辑运算符
- 在C语言中,逻辑运算符主要有 与或非。
- 表达方式
二元操作符的操作数是跟在符号两边的,而一元操作符的操作数则是跟在符号右边的
逻辑运算符的操作数可以是变量、数值 或 表达式
如:a&&b a||b !a
逻辑运算符的应用
1.运算结果(一般将值为零的变量、数值或表达式称为假,非零值称为真。)
(1)与运算(&&)
参与运算的操作数都为 “真” 时,结果才为 “真”,否则为 “假”。
(2)或运算(||)
参与运算的操作数都为“假”时,结果才为“假”,否则为“真”。
(3)非运算(!)
对于非运算,操作数为 “真”,运算结果为 “假”;操作数为 “假”,运算结果为 “真”;
2.运算符嵌套
逻辑运算符也是可以支持嵌套的,即运算结果可以继续作为逻辑运算符的操作数(先运算括号内的)
3.运算符优先级
∣∣ < && < !
位运算
布尔位运算
1.位与
每一位只有0或1两种情况,所以一共4种
左操作数 | 右操作数 | 结果 |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
位与运算特点:只要出现0,结果就为0
2.位或
左操作数 | 右操作数 | 结果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
位或运算的特点:只要出现1,结果就为1
3.异或
左操作数 | 右操作数 | 结果 |
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
异或运算特点:只要相同就为0,不同就为1
4.按位取反
特点:按位取反就是0变1,1变0
移位位运算
1.左移
其中x<<y代表将二进制的x的末尾添加y个0,就好比向左移动了y位
比如 1011 <<3表示的结果为1011000
2.右移
其中x>>y代表将二进制的x从右边开始截掉y个数,就好比向右移动了y位
比如101111>>2表示的结果为1011
位于运算符的应用
1.奇偶性判断
判断一个数是奇数还是偶数,往往是通过取模%
来判断的
二进制末尾数 | |
奇数 | 1 |
偶数 | 0 |
#include <stdio.h>
int main() {
if(5 & 1) {
printf("5是奇数\n");
}
if( (6 & 1) == 0 ) {
printf("6是偶数\n");
}
return 0;
}
对任何一个数,通过将它和
0b1
进行位与,结果为零,则必然这个数的二进制末尾位为0,根据以上表就能得出它是偶数了;否则,就是奇数
if语句
if( expr ) { body }
对于以上语句,expr
代表的是一个表达式,表达式的值最后只有 零 或 非零,如果值为非零,才会执行body
中的内容。
2.取末五位
我们只需要末五位,剩下的位我们是不需要的,所以可以将给定的数 位与上0b11111
,这样一来就直接得到末五位的值了
#include <stdio.h>
int main(){
int x;
while(true){
scanf("%d",&x);
printf("%d\n",(x&0b11111));
if(x<0) break;
}
return 0 ;
}
3.消除末尾五位
- 根据位与的性质,消除末五位的含义,有两层:
- 1)末五位,要全变成零;
- 2)剩下的位不变;
位或运算符的应用
1.设置标记位
例题:给定一个数,判断它二进制低位的第 5 位,如果为 0,则将它置为 1。
分析:无论第五位是否为零,我们都需要将第五位变为1,则我们可以运用位或运算
2.置空标记位
例题:给定一个数,判断它二进制低位的第五位,如果为1,将它置为零
分析:第一种:我们可以利用位与运算
第二种 :我们可以利用位或运算
具体操作(1)强行将第五位变为1
(2)利用减法将第五位置为零
#include <stdio.h>
int main() {
int x;
int a = 0b10000;
scanf("%d", &x);
printf("%d\n", (x | a) - a );
return 0;
}
异或运算符的应用
1.标记位取反
例题:给定一个数,将它的低位数起的第四位去反,0变1,1变0
分析:我们可以利用异或运算来解决问题,无论第四位为0还是1,异或0b1000后,就可以取反
2.变量交换
例题:给定两个数a和b,用异或运算交换他们的值
#include <stdio.h>
int main() {
int a, b;
while (scanf("%d %d", &a, &b) != EOF) {
a = a ^ b; // (1)
b = a ^ b; // (2)
a = a ^ b; // (3)
printf("%d %d\n", a, b);
}
return 0;
}
我们直接来看 ( 1 ) (1) (1) 和 ( 2 ) (2) (2) 这两句话,相当于b等于a ^ b ^ b,根据异或的几个性质,我们知道,这时候的b的值已经变成原先a的值了。
而再来看第 ( 3 ) (3) (3) 句话,相当于a等于a ^ b ^ a,还是根据异或的几个性质,这时候,a的值已经变成了原先b的值。
————————————————
版权声明:本文为CSDN博主「英雄哪里出来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/WhereIsHeroFrom/article/details/118739504
3.出现奇数次的数
例题:输入n个数,其中只有一个数出现了奇数次,其他的数都出现了偶数次,求这个出现了奇数次的数
分析:两个一样的数异或结果为零,也就是出现了偶数次的数异或都为零,把这n个数都异或一下,得到的数就为出现奇数次的数
取反运算符的应用
1.补码
正数的补码是它本身,符号位为 0;负数的补码为正数数值二进制位取反后加一,符号位为一
计算机中,两个互为相反数的数字加起来等于 2的n次方
所以,对于 32位整型, n = 32 ;对于 64位整型, n = 64
2.0的取反
(1)有符号整型 signed int,最高位表示符号位,所以只有31位能表示数值,能够表示的数值范围是:−2的31次方31≤x≤2的31次方−1
且对于有符号整型,输出采用%d
(2)无符号整型unsigned int ,由于不需要符号位,所以总共有32位表示数值,数值范围为:
0≤x≤2的32次方-1
且对于无符号整型,输出采用%u
3.相反数
例题:给定一个int类型的正数,求他的相反数。(不可以加负号)
利用补码的含义:一个负数的补码就是它的正数的二进制取反再加1
由此可以推出:那么正数x,它的相反数的补码就是x二进制取反加1.即~x+1
4.代替减法
例题:给定两个int型的正数x和y,实现x—y,不能用减号
由相反数的性质可得x-y等同于x+(-y),由此可得x+~y+1来代替x-y
举一反三:代替加法
可以用x-~y-1来代替x+y
左移运算符
1.左移运算符是一个二元运算符,表示为x<<y。其中x与y均为整数。
念作:将x左移y位 表示意思为:将x用二进制表示,然后左移y位,即在尾部添加y个零。
执行结果:x*2**y
2.负数左移的运算结果
x<<y其中x为负数
结果:-(x<<y)或(-x)<<y
3.左移时溢出会如何
4.取模转化成位运算
对于x模上一个2的次幂的数y,我们可以转化成位与上2**y-1
即在数学上的:x mod 2**y
在计算机中就可以用一行代码表示:x&((1<<y)-1)
5.生成标记码
我们可以用左移运算符来实现标记码,即1<<k作为第k个标记位的标记码,实现对标记位置0、置1、取反等操作。
(1)标记位置1
例题:对于x这个数,我们希望对它二进制位的第k位(从低到高数)置为1。
位或的特点:位或上1,结果为1 位或上0,结果不变
对标记码的要求:第k位为1,其他为0,正好是(1<<k),那么将第k位置为1的语句可以写成 x|(1<<k)
(2)标记位置0
例题:对于x这个数,我们希望对它二进制位的第k位(从低到高数)置为0。
位与的特点:位与上0,结果为0 位与上1,结果不变
所以对标记码的要求:第k位为0,其他为1,正好是(~(1<<k)),所以结果为x&(~(1<<k))
(3)标记为取反
例题:对于x这个数,我们希望对它二进制位的第k位(从低到高数)取反。
提到取反,我们可以想到异或。
异或的特点:异或上1,结果取反 异或上0,结果不变
则可以得出x^(1<<k)
(4)生成掩码
右移运算符
- 右移运算符是一个二元的位运算符,也就是拥有两个操作数,表示为x>>y。其中x和y为整数。
- x>>y念作:将x右移y位,他的意思为,将x用二进制表示,对于正数,右移y位;对于负数,右移y位后高位都补上1.
负数右移的执行结果:所谓负数右移就是x为负数
右移运算符的应用
1.去掉低k位
可以直接采用右移来完成,x>>k
2.取低位连续1
例题:获取一个数x低位连续的1并且输出。
由题可得
3.取第k位的值
例题:获取一个数的第k位(k大于等于0,k小于等于30),并输出
思路:(1)对于二进制来说,第k位不是0就是1
(2)既然要获取第k位的值,则对于1到k-1的数字都是无意义的,那么我们进行右移,即(x>>k)
(3)最后我们可以运用位与运算,通过位与上1来确定
即(x>>k)&1
赋值运算符
赋值运算符=的优先级低于关系运算符==
复合赋值运算符
字符*