目录
算数操作符
+ - * / %
除号( / ) 两边如果都是整数,则执行的是整数除法,得到的值也是整数。
比如:int a = 9/2; printf("%d\n",a), 得到的是 4,float a = 9/2; printf("%f\n",a), 得到的是4.000000。
除号两端( / )两边如果有一个小数,则执行的是小数除法,得到的也是小数。
比如:float a = 9/2.0;printf("%f\n",a),得到的是4.500000。
% —— 取模,也叫取余,int a = 9/2; printf("%d\n",a), 得到的是余数 1
移位操作符(移动的是二进制位)
>> (右移) << (左移:左边丢弃,右边补0)
左移举例:
位操作符
& 按位与
| 按位或
^ 按位异或
赋值操作符
= += -= *= /= &= |= ^= >>= <<=
#include<stdio.h>
int main(void)
{
int a = 2;
a += 5; // 这叫复合赋值,也可以写成 a = a + 5
printf("%d\n", a); //输出 7
return 0;
}
单目操作符:只有一个操作数的操作符
a + b: + 两边有2个操作数,叫双目操作符
! | 逻辑反操作 |
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数的类型长度(以字节为单位) |
~ | 对一个数的二进制取反。把所有二进制位中的数字,1变0,0变1 |
-- | 前置、后置-- |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符)查看用法 |
(类型) | 强制类型转换 |
!操作符举例:
#include<stdio.h>
int main(void)
{
//0 表示假,非0表示真
int a = 10;
printf("%d\n", !a); //!是取反的意思,a = 10为真, !a为假,输出0
return 0;
}
#include<stdio.h>
int main(void)
{
//0 表示假,非0表示真
int a = 0;
printf("%d\n", !a); //!是取反的意思,a = 0为假, !a为真,输出1
if (a)
{
//如果a为真,做事
}
if (!a)
{
//如果a为假,做事
}
return 0;
}
sizeof 举例:
sizeof 是一个操作符
计算类型或者变量大小的,也可以计算数组大小
sizeof 求变量的时候后面的括号可以省略,求类型的时候括号不可以省略,通常都不要省略
函数后面跟的括号无论如何是不可以省略的,所以sizeof是操作符不是函数
#include<stdio.h>
int main(void)
{
//sizeof 是一个操作符
//计算类型或者变量大小的
//sizeof 求变量的时候后面的括号可以省略,求类型的时候括号不可以省略
//函数后面跟的括号无论如何是不可以省略的,所以sizeof是操作符不是函数
int a = 10;
printf("%d\n", sizeof(int)); //输出 4
printf("%d\n", sizeof a); //输出 4
return 0;
}
#include<stdio.h>
int main(void)
{
int arr[10] = { 0 }; // 10个元素,每个元素都是一个整型int
printf("%d\n", sizeof(arr)); //输出 40 //计算的是数组的总大小,单位是字节,输出的是 10*4 = 40
printf("%d\n", sizeof(arr[0])); //求第一个元素的大小,输出 4
int sz = sizeof(arr) / sizeof(arr[0]); //计算一个数组的元素个数
printf("%d\n", sz); //输出 10
return 0;
}
~ 操作符举例:
#include<stdio.h>
int main(void)
{
int a = 0;
printf("%d\n", ~a); // 输出-1 // ~ 按(二进制)位取反
return 0;
}
整数在内存中储存的是 补码
一个整数的二进制表示有3种:原码 反码 补码
正整数的原码、反码、补码相同
负整数:
原码反码:原码的符号位不变,其余按位取反
补码:反码 + 1
-- ++ 操作符举例:
前置++ —— 运算规则:先++,后使用
#include<stdio.h>
int main(void)
{
int a = 10;
int b = ++a; //前置++ 运算规则:先++,后使用
printf("%d\n", b); // 输出11
printf("%d\n", a); // 输出11 因为 b = ++a 是先让 a = 11,再 b = a
return 0;
}
后置++ —— 运算规则:先使用,后++
#include<stdio.h>
int main(void)
{
int a = 10;
int b = a++; //后置++ 运算规则:先使用,后++
printf("%d\n", b); // 输出10
printf("%d\n", a); // 输出11 因为 b = a++ 是先让 b = 10,再 a = 11
return 0;
}
#include<stdio.h>
int main(void)
{
int a = 10;
int b = (++a) + (++a)+ (++a); //不建议研究这种代码,一般不会这样写
printf("%d\n", b); //输出39
return 0;
}
int a = 10;
int b = (++a) + (++a)+ (++a);
可以理解为 ++a 第一次 10 +1 =11
++a 第二次 11 + 1 =12
++a 第三次 12 + 1 =13
所以运算过后的 a = 13
因为 前置++ 的运算规则是:先++,后使用,所以 int b = (++a) + (++a)+ (++a)= 13 +13 + 13 = 39
(类型)举例:
对下面代码进行编译的时候,会跳出警告warning C4244: 'initializing': conversion from 'double' to 'int', possible loss of data 提示将double类型转换为int类型可能会丢失数据(丢失精度)
#include<stdio.h>
int main(void)
{
int a = 3.14;
printf("%d\n", a);
return 0;
}
如果不想看到这个警告,可以使用 强制类型转换 如下:
#include<stdio.h>
int main(void)
{
int a = (int)3.14; //强制类型转换
printf("%d\n", a);
return 0;
}
关系操作符
> >= < <= != (用于测试“不相等”) == (用于测试“相等”)
逻辑操作符
&& 逻辑与
#include<stdio.h>
int main(void)
{
int a = 3;
int b = 5;
int c = a && b;
printf("%d\n", c); //a和b都为真,c为真,输出 1
return 0;
}
| | 逻辑或
#include<stdio.h>
int main(void)
{
int a = 3;
int b = 0;
int c = a || b;
printf("%d\n", c); //a为真,b为假,c为真,输出 1
return 0;
}
条件操作符(三目操作符)
exp1 ? exp2 : exp3
exp1 成立,exp2计算,整数表达式的结果是:exp2的结果
exp1 不成立,exp3计算,整数表达式的结果是:exp3的结果
比如:
#include<stdio.h>
int main(void)
{
int a = 0;
int b = 3;
int max = 0;
if (a > b)
max = a;
else
max = b;
printf("%d\n", max); //输出 3
return 0;
}
用条件操作符表达如下:
#include<stdio.h>
int main(void)
{
int a = 0;
int b = 3;
int max = 0;
max = a > b ? a : b; //如果a>b,则输出a,否则输出b
printf("%d\n", max); // 输出3
return 0;
}
逗号表达式 —— 逗号隔开的一串表达式
exp1, exp2, exp3, ……expN
逗号表达式是从左向右依次计算的,整个表达式的结果是最后一个表达式的结果
比如 y = (35, 45), 实际是把45赋值给了y,即 y = 45
#include<stdio.h>
int main(void)
{
int a = 2;
int b = 3;
int c = 5;
//逗号表达式是从左向右依次计算的
//整个表达式的结果是最后一个表达式的结果
int d = (a = b + 3, b = a - 2, c = a + b); //a = 6, b = 4,c = 10
printf("%d\n", d); // 输出10
return 0;
}
下标引用、函数调用和结构成员操作符
[ ] ( ) . -> (. ->用法在这篇文章,点击这里)
[ ] 和 ( ) 举例: