格式化输出及

一. 格式化输出

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作为前缀,然后跟上01组成的数字

八进制:前缀1个0,然后跟上0-7的数字

十六进制:以0x或者0X作为前缀,跟上0-9a-fA-F的数字,其中大小写字母的含义相同,分别代表从1015的数字

ASCII码(ask2码)

 注:本图选自 英雄哪里出来https://img-blog.csdnimg.cn/20210619064922444.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1doZXJlSXNIZXJvRnJvbQ==,size_1,color_FFFFFF,t_70#pic_center

ASCII 码的输出:ASCII 码对应的字符用单引号括起来,并且是可以按照两种方式来输出的,分别为:字符形式 和 整数形式

ASCII 码的运算

字符加上一个数字,我们可以认为是对字符编码进行了一个对应数字的偏移,字符'0'向右偏移 5 个单位,就是字符'5';同样的,'A'向右偏移3个单位,就是字符'D'

运算时:注意输出的形式,是字符还是整数,避免自己犯错

数值常量分为整数和浮点数,整数一般称为整型常量,浮点数则称为实型常量。

 后缀,uunsigned)代表无符号整数,llong)代表长整型,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种

左操作数右操作数结果
000
010
100
111

位与运算特点:只要出现0,结果就为0

2.位或

左操作数右操作数结果
000
011
101
111

位或运算的特点:只要出现1,结果就为1

3.异或

左操作数右操作数结果
000
011
101
110

异或运算特点:只要相同就为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

赋值运算符

赋值运算符=的优先级低于关系运算符==

复合赋值运算符

 

字符*

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值