需要特别注意的为:/ 除,结果为商值。若想结果输出为小数值,则除数和被除数中至少有一个为小数。 例:9/2=4;9.0/2=4.5;9/2.0=4.5
% 取模(余),结果为余数。 例:3%2=1;7%3=1
#include
int main()
{
int a = 9 / 2;
float b = 9.0 / 2;
float c = 9 / 2.00;
int d = 10 % 4;
printf("%d\n", a);
printf("%f\n", b);
printf("%f\n", c);
printf("%d\n", d);
return 0;
} /*输出结果为:4
4.500000
4.500000
2*/
>> 右移 —— 相当于乘以2
<< 左移 —— 相当于除以2
例:当 int a=8;时,a=8对应的二进制位为1000
因为a为整形,即4个字节,32个比特位
所以 int a=8 对应的二进制为:00000000000000000000000000001000 8
左移一位为:00000000000000000000000000010000 16
右移两位为:00000000000000000000000000000010 2
#include
int main()
{
int a = 8;
int b = a << 1;
int c = a >> 2;
printf("%d\n", b);
printf("%d\n", c);
return 0;
} /*输出结果为:16
2*/
& 按位与
^ 按位异或
| 按位或
例:int a = 2;
int a = a + 5;
以上可简化写成:int a += 5;
单目操作符:只有一个操作数。 例:-a
双目操作符:有两个操作数。 例:a-b
单目操作符 | 用法 |
---|---|
! | 逻辑反操作 |
- | 负值 |
+ | 正值 —— 一般省略 |
& | 取地址 |
sizeof | 计算操作数的类型长度(单位为字节)—— 可计算类型、变量、数组的大小 |
~ | 对一个数的二进制按位取反 |
-- | 前置、后置-- |
++ | 前置、后置++ |
* | 间接访问操作符(解引用操作符) |
(类型) | 强制类型转换 |
C语言中,0表示假;非0表示真。
用法:if (a) //如果a为真
if (!a) //如果a为假
// ! 逻辑反操作
#include
int main()
{
int a = 10; // a=10为非0,为真,所以!a输出结果为0
int b = 0; // b=0,为假,所以!b输出结果为真,真的输出值均为1
printf("%d\n", !a);
printf("%d\n", !b);
return 0;
} /*输出结果为:0
1*/
sizeof 可以计算类型、变量和数组的大小,单位为字节。
如下代码中,计算数组的大小的输出值为40是因为该数组中有10个元素,每个元素为1个整形,一个整形为4个字节,因此输出值为40;
计算数组中元素个数是利用数组的总大小/一个元素的大小 = 个数。
// sizeof 长度计算操作符
#include
int main()
{
int a = 10;
int arr[10] = { 2 };
int sz = sizeof(arr) / sizeof(arr[2]);
printf("%d\n", sizeof(int)); //计算类型的大小
printf("%d\n", sizeof(a)); //计算变量的大小
printf("%d\n", sizeof(arr)); //计算数组的大小
printf("%d\n", sizeof(arr[0])); //计算数组的大小
printf("%d\n", sizeof(sz)); //求数组元素个数
}
/*输出结果为:4
4
40
4
4*/
记住位打印类型及三码(原码、反码、补码)转换规则即可。
按位取反———将所有位全部取反,即将所有二进制位中数字 0变成1,1变成 0。
一个整数中的二进制表示有3种:原码、反码、补码。(正整数三码相同,负整数则需计算。)
针对负数计算方式:1. 写出二进制数的原码序列,一个整数的二进制序列最高位为符号位(负数的符号位为1),其余为有效位;
2. 原码序列的符号位不变,有效位取反得到反码序列;
3. 反码序列的符号位不变,有效位加1得到补码序列。
例:二进制数 -1;—— 为整形,有4个字节,即32比特位。
原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111
整数在内存中存储的是补码;%d打印出来的为真实值,即原码。
例:int a = 0;
a 二进制为:00000000000000000000000000000000 (32位)
~a 二进制位:11111111111111111111111111111111 (补码)(32位)
11111111111111111111111111111110 (反码)
10000000000000000000000000000001 (原码)
所以输出的数值为:-1
// ~按位取反操作符
#include
int main()
{
int a = 0;
printf("%d\n", ~a);
return 0;
} //输出结果为:-1
//前置-- ++操作符
#include
int main()
{
int a = 34;
int b = ++a; //先++,后使用
printf("%d\n", b);
printf("%d\n", a);
return 0;
} /*输出结果为:35
35*/
//后置-- ++操作符
#include
int main()
{
int a = 34;
int b = a--; //先使用,后--
printf("%d\n", b);
printf("%d\n", a);
return 0;
} /*输出结果为:34
33*/
//前置、后置-- ++操作符
#include
int main()
{
int a = 28;
int b = a--; //先使用,后--
int c = ++b;
printf("%d\n", b);
printf("%d\n", a);
printf("%d\n", c);
return 0;
} /*输出结果为:29
27
29*/
//不建议研究
#include
int main()
{
int a = 2;
int b = (++a) + (++a) + (++a) + (++a); //++a优先级最高,先算出++a的最终值为6,在进行四个6相加
printf("%d", b);
return 0;
} //输出结果为:24
//带小数点的默认为double类型——小数可以有1215位,float小数可以有6位
#include
int main()
{
int a = 3.14;
printf("%d", a);
return 0;
} //输出结果为:3
//此时会警告有丢失数据的可能,因为3.14为double类型
//正确写法
#include
int main()
{
int a = (int)3.14;
printf("%d", a);
return 0;
} //输出结果为:3
&& 逻辑与——并且 有一假则为假,两同为真则为真
|| 逻辑或——或者 有一真则为真,两同为假则为假
#include
int main()
{
int a = 3;
int b = 0;
int c = 5;
int d = 0;
int e = a && b;
int f = a && c;
int g = b && c;
int h = a || b;
int i = a || c;
int j = b || c;
printf("%d ", e);
printf("%d ", f);
printf("%d ", g);
printf("%d ", h);
printf("%d ", i);
printf("%d ", j);
return 0;
} // 输出结果为:0 1 0 1 1 1
即三目操作符,有三个操作数,分别为 exp1 exp2 exp3
若 exp1 成立,则 exp2 计算,整个表达式的结果为:exp2 的结果;
若 exp1 不成立,则 exp3 计算,整个表达式的结果为:exp3 的结果;
例:求较大值、较小值
//条件操作符 exp1 ? exp2 : exp3
#include
int main()
{
int a = 6;
int b = 9;
int max = 0;
int min = 0;
max = a > b ? a : b;
min = a < b ? a : b;
printf("max=%d\n", max);
printf("min=%d\n", min);
return 0;
} /*输出结果为:max = 9
min = 6*/
特点:从左到右依次计算,整个表达式的结果为最后计算的结果。
//逗号表达式 exp1, exp2, exp3, ...expN
#include
int main()
{
int a = 2;
int b = 9;
int c = 7;
int d = (b = a + 7, c = b - 3, b = c + 4); //从左到右依次计算:b = 9 c = 6 b =10
printf("%d\n", d);
return 0;
} //输出结果为:10
int arr[10] = { 1,2,3,4,5,6,7 };
printf("%d", arr[5]); //[]下标引用 ()调用函数
//调用函数时,函数名后边的()即为函数调用操作符,可以传递0-多个参数