算术运算符、关系运算符、逻辑运算符、位运算符
1、算术运算符
+ - * / % ++ --
%:小数没有取模运算
++:
++在前:先自加,后赋值
++在后:先赋值,后自加
2、关系运算符
> < == >= <= !=
if(a == 5) 建议写成if(5 == a),以防写成if(a = 5)
3、逻辑运算符
&&:两边同时为真时,其值才为真
截断法则:当&&左边为假时,其值一定为假,所以&&右边不执行
||:两边同时为假,其值才为假
截断法则:当||左边为真时,其值一定为真,所以||右边不执行
!
4、位运算符 ~ & | ^ << >>
~10101100 01010011
&: 0011 1100
& 1011 0011
0011 0000
(1)判断某个数的某一位是0还是1
0011 1100
& 0010 0000
0010 0000
(2)清除某个数的某一位或某几位
0011 1100
& 1100 0111
0000 0100
(3)设置某个数的某一位或某几位(先清0,再设置, 先与后或)
0011 1100
& 1100 0111
0000 0100
| 0010 1000
0010 1100
^ : 两个位进行异或时,相同为0,不同为1
0011 1100
^ 0000 0000
0011 1100
一个变量与0异或,结果是变量本身
0011 1100
^ 1111 1111
1100 0011
翻转某个数的某一位段
0011 1100
^ 0011 1000
0000 0100
<<:左移
左移时,可能会引起符号位的改变
溢出部分不要,右边补0
>>:右移
溢出,溢出部分不要
高位:正数:高位补0
负数:高位补1
5、条件运算符
三目运算符:表达式1 ? 表达式2 : 表达式3;
其求值过程:判断表达式1是否成立,如果成立,执行表达式2,否则执行表达式3
定义宏函数时,因为宏只是单纯的符号替换,所以需要给每个变量加上括号,并且给整个表达式加上括号;
6、逗号运算符
表达式1, 表达式2;
其求值过程分别求两个表达式的值,并以表达式2的值作为整个表达式2的值;
逗号运算符的优先级最低
表达式1, 表达式2, 表达式3,……,表达式n;
每个表达式都会执行,并把表达式n的值作为整个表达式的值;
sizeof:计算所占内存的大小(字节)
sizeof(数据类型/变量名);
二、
1、字符的输入与输出
getchar:函数原型 int getchar(void)
返回值:成功:读到字符的ASCII值
失败:-1
putchar: int putchar(int c);
功能:向终端打印一个字符
其中参数c,表示要输出的字符的ASCLL值
返回值:成功:成功输出的字符的ASCLL值
失败:-1
#include<stdio.h>
int main()
{
char str = getchar();
printf("%c\n,%d\n",str,str);
return 0;
}
#include<stdio.h>
int main()
{
char str = 'A';
int ret = 0;
ret = putchar(str);
putchar(97);
printf("\nret=%d\n",ret);
return 0;
}
2、标准格式化输入与输出
printf:
int printf(“格式控制串“,输出表);
功能:向终端打印输出
返回值:成功:成功输出的字符数(按终端统计)
失败:-1
%d——输出有符号的十进制整型数
%hd——有符号的十进制的短整型数
%ld——long
%lld——long long
%o——八进制无符号整数
%x/X——十六进制无符号整数
#——自动在 八进制前面加0,在十六进制前面加0x
%c——字符型
%f——单精度的有符号浮点数
%lf——double
%e——指数形式浮点数
%g——%f与%e较短的一种
%s——字符串,以‘\0’结尾
m——输出数据的域宽,如果数据的宽度大于m时,数据按原样输出,小于m时,数据右对齐,左补空格
-——左对齐,右补空格
.n——浮点数小数位保留n位,第n+1四舍五入
打印字符串时,n表示打印多少个字符
#include<stdio.h>
#include<stdbool.h>
int main()
{
int a = -10;
float b = 3.1415;
double c = 9.7865342;
char d = 'E';
unsigned int e = 8976;
short f = 67;
bool g = false;
float h = 31456;
unsigned int i = 34;
char str[6] = "abcde";
printf("a=%-5d,b=%4f,c=%4.2lf,d=%c,e=%#X,e=%#o,e=%2u,f=%4hd,g=%d,h=%e,i=%u,str=%.4s\n",a,b,c,d,e,e,e,f,g,h,i,str);
return 0;
}
scanf——标准格式化输入函数
int scanf(“格式控制串”,地址表);
功能:按指定的格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束
返回值:成功:成功输入的变量的个数
失败:返回-1
当需要给多个变量赋值时,就存在了怎么去分割的问题,一般以空格、tab键、回车键
分隔符
当输入字符数据时,容易产生垃圾字符‘ 空格 ’,‘\n’
解决办法:1、%*c *表示不把输入的值赋给变量
2、getchar();
#include<stdio.h>
int main()
{
int a,b,c;
int ret;
char str[5]="abcd";
printf("input three nums:\n");
ret=scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d,ret=%d\n",a,b,c,ret);
return 0;
}
3、字符串的输入与输出
gets:char *gets(char *s);
功能:从键盘得到一个以回车结束的字符串放到字符数组中,并自动加‘\0’
s:字符数组
返回值:成功则返回字符数组的起始地址
失败:NULL
puts:int puts(const char *s);
功能:向终端输出字符串
参数:s:需要输出的字符串
返回值:成功:成功输出的字符的个数
失败:-1
使用gets时注意不要越界,只能输入n-1个;
并且gets只以回车作为字符串的输入结束标志。
#include<stdio.h>
int main()
{
char str[10];
unsigned int num;
char *p = NULL;
p = gets(str);
num = puts(str);
printf("p=%p\n,num=%u\n,str[0]=%p\n",p,num,&str[0]);
}