目录
承接14.【C语言】初识操作符 上文章
05单目操作符
补上一篇的位操作符
~:按(二进制)位取反(补码)(NOT运算)
有关带符号整数的二进制的三种表示:原码,反码,补码
int 32个bit
表示-1
原码
10000000000000000000000000000001 (最左边是符号位,0正1负,剩余是数值位,数值为表示真值-1的绝对值)
反码:
负数:在原码基础上数值位0改1,1改0(即按位取反),符号位不变
正数:原码即反码
-1:01111111111111111111111111111110
补码:
负数:反码末尾+1
正数:反码即补码
-1:01111111111111111111111111111111
所以正数:原码=反码=补码
表示0
原码
00000000000000000000000000000000或10000000000000000000000000000000
(+0和-0均可)
#include <stdio.h>
int main()
{
int a = 0;
printf("%d", ~a);
return 0;
}
结果:-1
由于整数在内存中存储的是补码,整数的真实值是由原码得到的
printf打印的是二进制补码转成原码的十进制数字
0:原码00000000000000000000000000000000
反码11111111111111111111111111111111
补码11111111111111111111111111111111 (不变,如果末尾+1会溢出)
++(自增)和--(自减):
使用分为前置和后置
前置 ++a --a
后置 a++ a--
前置++
先++,后使用
int a=3;
int b=2;
b=++a;
先++(就是+1):a的值由3变4,后使用:4赋值给b
同理b=--a;(--就是-1)
#include <stdio.h>
int main()
{
int a = 3;
int b = 2;
b = --a;
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
后置++
先使用,后++
int a=3;
int b=2;
b=a++;
先使用:a的值未变时先赋值给b
后++:a的值+1
同理b=a--
(类型):当类型不匹配时,可强制类型转换
int a=(int)1.21;
把1.21强制转换为整型
(& *在第19篇)
06关系操作符(比较大小关系)
>大于
>=大于等于
<小于
<=小于等于
!=不等于
==等于(容易写成=)
07逻辑操作符
&& 逻辑与(a与b同时)
与:a与b任意一个为假则为假,a与b全真则为真
#include <stdio.h>
int main()
{
int a = 3;//a非0,见第14篇
int b = 2;//b非0
int c = a && b;//逻辑与判断:a与b均非0,则a与b为真
printf("%d\n", c);//输出1
return 0;
}
非常经典的闰年判断:
普通闰年:公历年份是 44 的倍数,且不是 100100 的倍数的,为闰年(如 20042004 年、20202020 年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是 400400 的倍数才是闰年(如 19001900 年不是闰年,20002000 年是闰年)。
if ((year%4==0 && year%100!=0) || (year%400==0))
||逻辑或(a或b)
或:a与b任意一个真则真,两个都为假则假
#include <stdio.h>
int main()
{
int a = 0;//a假
int b = 0;//b假
int c = a || b;//逻辑与判断:a或b为假
printf("%d\n", c);//输出0
return 0;
}
07.5 逻辑操作符的特点
总是先对左侧的表达式求值,再对右边的表达式求值。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”
换而言之,逻辑运算符总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证
的,如果左边的表达式就能确定整个表达式的结果,就不再对右边的表达式求值
如
if (a>=3 && a<=5)
printf("ABC");
当a=2时,不满足 a>=3,由&&的运算规则,a<=5的判断不会执行,不打印ABC
if (a>=3 || a<=5)
printf("ABC");
当a=3时,满足a>=3, 由||的运算规则,a<=5的判断不会执行,打印ABC
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值
08条件操作符(三目操作符)
格式:表达式1?表达式2:表达式3即为exp1?exp2:exp3
规则:exp1成立,计算exp2,得出结果;exp1不成立,计算exp3,得出结果;(其实类似if语句)
例:输入两数输出最大值
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d", &a, &b);
c= a > b ? a : b;
printf("%d\n", c);
return 0;
}
如果调用数组则简洁:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a[3] = { 0 };
scanf("%d %d", &a[0], &a[1]);
a[2] = a[0] > a[1] ? a[0] : a[1];
printf("%d\n", a[2]);
return 0;
}
例:
if (a>5)
b=3;
else
b=-3;
等价为
b=(a>5):3:-3;
09逗号表达式
定义:逗号隔开的一串表达式
exp1,exp2,exp3,……,expn
程序从左向右依次执行exp
整个exp的结果是最后一个exp的结果
例1
int a=0;
int b=0;
int d=(a=a+1,c=c+2,c=c-a);
d为1
例2
简化代码
a = get_val();
count_val(a);
while (a > 0)
{
//业务处理
//...
a = get_val();
count_val(a);
}
可改为
while (a = get_val(), count_val(a), a>0)
{
//业务处理
}
10.其他操作符
[ ](下标引用操作符)
可用于定义数组
介绍()
( )
1.函数调用
printf();
格式:函数名(内容);
(.和->在第20篇 http://t.csdnimg.cn/px53w)
2.强制类型转换
格式
(类型)
int a = (int)3.14;//a的输出结果是3
float b=4/(double)5;//b的输出结果是0.800000