2023/7/12 -- C语言基础

作业:

  1. 整理思维导图
  2. 将data中的第[7:4]位置1,保持其他位不变。[7:4]表示4-7bit位
     
    #include <stdio.h>
    
    int main(int argc, const char *argv[])
    {
    	int data;
    	printf("%d\n",data|(0xf<<4));
    	return 0;
    }
    
  3. 思考如何交换两个数
    #include <stdio.h>
    
    int main(int argc, const char *argv[])
    {
    	int a = 0;
    	int b = 0;
    	printf("请输入a、b两个数:");
    	scanf("%d%d",&a,&b);
    
    #if 0
    	int temp = 0;
    	temp = a;
    	a = b;
    	b = temp;
    #endif
    
    #if 0
    	a = a+b;
    	b = a-b;
    	a = a-b;
    #endif
    
    #if 1
    	a = a^b;
    	b = a^b;
    	a = a^b;
    #endif
    
    	printf("交换后 a = %d b = %d\n",a,b);
    	return 0;
    }
    
  4. 把课上位运算的第2题,再整理一遍
    有unsigned char a; 1111 1111 ---->bit默认从0开始
    
    给a的第6个bit置1--->或 a | 0100 0000 a|(0x1)
    
    给a的第4个bit置0--->与 a & 1110 1111 ~(0001 0000) = 1110 1111 a&~(0x1)
    
    给a的第5个bit取反--->异或 (同0异1) a ^ 0010 0000 a^(0x1)

目录

作业:

七、输入输出函数

【1】标准输出函数

【2】标准的输入函数

scanf连续获取字符时需要吸收垃圾字符

i)使用scanf严格控制格式的特点吸收垃圾字符

ii)在%c前面加空格

iii)通过抑制字符吸收

iv)使用getchar吸收垃圾字符

【3】单个字符的输入函数getchar()

【4】单个字符的输出函数putchar()

八、运算符

【1】算数运算符

【2】赋值运算符

【3】自增自减运算符

【4】关系运算符

【5】逻辑运算符

逻辑短路现象

【6】条件运算符

【7】逗号运算符

【8】sizeof运算符

【9】位运算符

【10】运算符的优先级


七、输入输出函数

【1】标准输出函数

双引号内有一个格式符,逗号后面就要有一个输出表象
格式符之间以逗号作为分隔,每个输出表象以逗号作为分隔

printf("格式符+转义字符",输出表象);
函数原型:
    int printf(const char *format, ...);
    
printf的使用:
双引号中的内容原封不动输出

格式符:
%d,十进制输出有符号数
%ld,十进制输出有符号长整型
%f,输出float类型
%lf,输出double类型
%c,输出字符类型
%s,输出字符串
%u,无符号输出整形的十进制
%#X/x:输出十六进制(无符号)  ----->#输出前导符
%#o:输出八进制(无符号)    
%.nf:输出小数点后n位,不足补0
%nd:以n个数据宽度靠右对齐输出,不足补空格,超出全部输出
%-nd:以n个数据宽度靠左对齐的输出,不足补空格,超出全部输出
%p:输出内存地址的    

转义字符:
\n:换行
\t:制表符
\r:回车,回到当前行的首位进行输出          
\b:后退一格,回到上一个位置进行输出   

【2】标准的输入函数

scanf获取数据时,以空格、tab键和回车作为数据之间的分隔,
回车在缓冲区内数据个数>=格式符个数时,回车是结束的标志

函数原型:
    int scanf(const char *format, ...);
使用:
    scanf("格式符",变量的地址); 

注意事项:
    1、逗号后面的内容,是变量的地址
    2、scanf的双引号内不要加\n
    3、scanf是严格控制格式的函数,终端输入的格式要和双引号内的格式严格一致

使用带参宏完成加法、减法、除法和乘法的功能,要求传入的参数从终端获取。

#include <stdio.h>
#define ADD(a,b) a+b
#define SUB(a,b) a-b
#define MUL(a,b) a*b
#define DIV(a,b) a/b
#define FUN a*b
int main(int argc, const char *argv[])
{
    int var1,var2;
    scanf("%d%d",&var1,&var2);  //实现var1和var2的终端输入
    printf("%d\n",ADD(var1,var2));

    //给带参宏浮点型的参数
    float num1,num2;
    scanf("%f%f",&num1,&num2);
    printf("%.3f\n",SUB(num1,num2));
    printf("%.3f\n",DIV(num1,num2));
    printf("%.3f\n",MUL(num1,num2));

    //printf("%d\n",FUN);
    //a*b   要求程序中有a和b两个变量
    return 0;
}
scanf连续获取字符时需要吸收垃圾字符

只有%c获取数据的情况下需要吸收垃圾字符

#include <stdio.h>
int main(int argc, const char *argv[])
{
    char c1,c2,c3;
    scanf("%c%c%c",&c1,&c2,&c3);
    printf("c1=%c\n",c1);
    printf("c2=%c\n",c2);
    printf("c3=%c\n",c3);
    return 0;
}
i)使用scanf严格控制格式的特点吸收垃圾字符
#include <stdio.h>
int main(int argc, const char *argv[])
{
    char c1,c2,c3;
    //利用scanf严格控制格式的特点
 //终端输入的空格,会被双引号的空格格式吸收
    scanf("%c %c %c",&c1,&c2,&c3);
    printf("c1=%c\n",c1);
    printf("c2=%c\n",c2);
    printf("c3=%c\n",c3);
    return 0;
}
ii)在%c前面加空格
#include <stdio.h>
int main(int argc, const char *argv[])
{
    char c1,c2,c3;

    //在可能出现垃圾字符的位置放空格,空格会吸收掉所有的垃圾字符
    scanf("%c",&c1);
    scanf(" %c",&c2);
    scanf(" %c",&c3);
    printf("c1=%c\n",c1);
    printf("c2=%c\n",c2);
    printf("c3=%c\n",c3);
    return 0;
}
iii)通过抑制字符吸收
%*c:吸收一个字符但是不会获取给任何变量
不建议使用%*C,一定会吃掉一个字符
    
#include <stdio.h>
int main(int argc, const char *argv[])
{
    char c1,c2,c3;
    //利用scanf严格控制格式的特点
    scanf("%c%c%c",&c1,&c2,&c3);
    /*printf("c1=%c\n",c1);
    printf("c2=%c\n",c2);
    printf("c3=%c\n",c3);*/

    //在可能出现垃圾字符的位置放空格,空格会吸收掉所有的垃圾字符
    /*scanf("%c",&c1);
    scanf(" %c",&c2);
    scanf(" %c",&c3);*/
    
    //通过抑制字符%*c吸收垃圾字符
    //scanf("%c%*c%c%*c%c",&c1,&c2,&c3);
    printf("c1=%c\n",c1);
    printf("c2=%c\n",c2);
    printf("c3=%c\n",c3);
    return 0;
}
iv)使用getchar吸收垃圾字符
#include <stdio.h>
int main(int argc, const char *argv[])
{
    char c1,c2,c3;
    //利用scanf严格控制格式的特点
    //scanf("%c%c%c",&c1,&c2,&c3);
    /*printf("c1=%c\n",c1);
    printf("c2=%c\n",c2);
    printf("c3=%c\n",c3);*/

    //在可能出现垃圾字符的位置放空格,空格会吸收掉所有的垃圾字符
    /*scanf("%c",&c1);
    scanf(" %c",&c2);
    scanf(" %c",&c3);*/
    
    //通过抑制字符%*c吸收垃圾字符
    //scanf("%c%*c%c%*c%c",&c1,&c2,&c3);
    
    //使用getchar吸收垃圾字符
    //每用%c获取一个字符后,都加入一个getchar吸收掉空格、tab或者回车
    scanf("%c",&c1);
    getchar();
    scanf("%c",&c2);
    getchar();
    scanf("%c",&c3);
    printf("c1=%c\n",c1);
    printf("c2=%c\n",c2);
    printf("c3=%c\n",c3);
 


    return 0;
}

【3】单个字符的输入函数getchar()

函数原型:
    int getchar(void);
    返回值:字符的ASCII码
    参数:(void),没有参数
功能:
    从终端获取单个字,并返回该字符ASCII码  

【4】单个字符的输出函数putchar()

函数原型:
    int putchar(int c);
    返回值:int
    参数:int c  ----->要输出的字符的ASCII码
功能:
    输出单个字符 
    putchar(10);  ---->\n换行

八、运算符

【1】算数运算符

运算符格式功能
+ - *a+ - * b两数相加、相减和相乘
/a/b

如果运算符两侧的操作数都是整型,就是取整操作

如果运算符两侧有一个操作数时浮点型,结果就是整除

%a%b

取a/b的余数部分

要求两个操作数都是整型

【2】赋值运算符

=是赋值运算符,=左侧叫左值,=右侧叫右值

运算符格式功能
=a=b把b的值赋给a
+=a+=ba=a+b,把a+b的结果赋值给a
*=a*=ba=a*b,把a*b的结果赋值给a
·········

【3】自增自减运算符

a++、++a、a--、--a
a++和++a都可以实现a的自增。
观察运算符先出现还是变量先出现
运算符先出现,拿到的就是运算后的结果
变量先出现,拿到的就是变量本身的值

【4】关系运算符

关系运算的结果,非真即假,非0即1
计算机中真假如何表示?0为假,非0为真

运算符

格式

功能

==

a==b

判断两数是否相等

!=

a!=b

判断两数是否不相等

>、>=

a>=/>b

判断a是否大于b,a大于等于b

终端输入一个三位数,输出该三位数的个位、十位和百位
#include <stdio.h>
int main(int argc, const char *argv[])
{
    int num;
    scanf("%d",&num);

    printf("个位:%d\n",num%10);
    printf("十位:%d\n",num/10%10);
    printf("百位:%d\n",num/100);
    return 0;
}

【5】逻辑运算符

逻辑运算的结果,非真即假,非0即1

运算符格式功能
&&a&&b

逻辑与

如果运算符两侧的表达式都为真,结果才为真

||a||b

逻辑或

如果运算符两侧的表达式有一个为真,结果就为真

!

!a

a=0,!a=1

a为非0数,!a为0

逻辑短路现象

逻辑与,如果左侧表达式结果为假,逻辑运算的结果为假,右侧的表达式不会执行
逻辑或,如果左侧表达式结果为真,逻辑运算的结果为真,右侧的表达式不会执行

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int a=9,b=0;
    printf("%d\n",a+b&&b||b++);
    //--b没有执行
    printf("%d\n",a+b&&++b||--b);
    printf("%d\n",b);

    //前面b=2,!b=0  !a,b++不会执行 ,--a执行 a=8
    printf("%d\n",!b&&!a&&b++||--a);
    printf("a=%d\tb=%d\n",a,b);
    return 0;
}

【6】条件运算符

是C语言中唯一一个三目运算符

表达式1?表达式2:表达式3

执行逻辑:
    如果表达式1成立,执行表达式2,否则执行表达式3
    a>b?a:b  --->如果a>b,返回a,否则返回b

【7】逗号运算符

(表达式1,表达式2,表达式3,·····)
执行逻辑:从左至右每一个表达式都会执行,取最右侧表达式的结果

【8】sizeof运算符

sizeof,是C语言中的一个关键字
求数据的大小,以字节为单位

sizeof()的结果,64位,unsigned long int;
                          32位,unsigned int;

使用:
    sizeof(数据);
    
#include <stdio.h>
int main(int argc, const char *argv[])
{
    printf("int的大小=%ld\n",sizeof(int));
    printf("double的大小=%ld\n",sizeof(double));
    printf("char的大小=%ld\n",sizeof(char));
    return 0;
}
  

【9】位运算符

位运算是对二进制位进行操作的

运算符格式功能
>>a>>3,a按位右移三位右移运算符,高位补0
<<a<<3,a按位左移三位左移运算符,低位补0
&a&b,两个bit都为1时,结果为1,否则为0按位与
|a|b,两个bit都为0时,结果为0,否则为1按位或
^a^b,同0异1按位异或
~~a,对a的每一个bit位取反按位取反
a = 0000 1010;

a >> 3 = 0000 0001 = 1 a

0000 0011

0000 0001 & = 0000 0001

0000 0011

0000 0001 | = 0000 0011

0000 0011

0000 0001 ^ = 0000 0010 (同0异1)

位运算的口诀:

0与任何数都是0,与运算用于给某一位置0
1或任何数都是1,或运算用于给某一位置1
0异或任何数都数本身,1异或任何数都是取反

有unsigned char a; 1111 1111 ---->bit默认从0开始

给a的第6个bit置1--->或 a | 0100 0000 a|(0x1)

给a的第4个bit置0--->于 a & 1110 1111 ~(0001 0000) = 1110 1111 a&~(0x1)

给a的第5个bit取反--->异或 (同0异1) a ^ 0010 0000 a^(0x1)

【10】运算符的优先级

()优先级最高

口诀:单算移关与        异或逻条符        逗号运算符的优先级最低

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值