初始操作符2

~

1
~           对一个数的二进制按位取反

对一个数的二进制按位取反

1
2
3
4
5
6
int main()
{
int a = 0;
printf("%d\n", ~a);//按位取反
return 0;
}

结果是-1

原因是按位取反是指将把内存中的01全部取反,并且整数在内存中储存的是补码

a=0举例子

首先介绍一个整数的二进制表示的3种情况

原码:是将二进制的最高位变成符号位,最高位为0则为正,反之为负

反码:就是将原码除符号位(最高位)剩下的的0和1全部反转

补码:在反码的基础上+1

回到例子

PS:正整数”三码合一“

— 和 ++

1
2
--          前置、后置--
++ 前置、后置++
1
2
3
4
5
6
7
8
int main()
{
int a = 10;
int b = ++a;//前置++,先赋值后使用
printf("%d\n", b);
printf("%d\n", a);
return 0;
}

结果是11 11

1
2
3
4
5
6
7
8
int main()
{
int a = 10;
int b = a++;//后置++,先使用后赋值
printf("%d\n", b);
printf("%d\n", a);
return 0;
}

结果是10 11

—与++同理

强制类型转换

1
2
3
4
5
6
int main()
{
int a = 3.14
printf("%d\n", a);
return 0;
}

这种方式虽然可以出结果但会报错,因为a原来是浮点数,强制转换会丢失浮点数之后数据

如果想要消除报错可以选择进行强制类型转换

1
2
3
4
5
6
7
int main()
{//强制类型转换
//int a = 3.14;
int a = (int)3.14;//可以用但不推荐
printf("%d\n", a);
return 0;
}

关系操作符

1
2
3
4
<=			小于等于
>= 大于等于
== 等于
!= 不等于

逻辑操作符

1
2
&&			逻辑与
|| 逻辑或

计算机的逻辑用语,与高中数学的且、或的用法一致

逻辑与 都真为真,一假全假

逻辑或 都假为假,一真全真

1
2
3
4
5
6
7
8
int main()
{
int a = 3;
int b = 5;
int c = a&&b;
printf("%d\n", c);
return 0;
}

结果为1

1
2
3
4
5
6
7
8
int main()
{
int a = 3;
int b = 0;
int c = a&&b;
printf("%d\n", c);
return 0;
}

则结果为0

条件操作符

条件操作符也是一种三目操作符

1
exp1 ? exp2 : exp3

使用逻辑是

当exp1成立时,exp2 进行计算,整个表达式的结果是exp2的结果

当exp1不成立时,exp3进行计算,整个表达式的结果是exp3的结果

1
2
3
4
5
6
7
8
9
10
11
int main()
{
int a = 0;
int b = 3;
int max = 0;
if(a>b)
max = a;
else
max = b;
return 0;
}

用条件操作符就可以简化

1
2
3
4
5
6
7
8
int main()
{
int a = 0;
int b = 3;
int max = 0;
max = a>b ? a : b;
return 0;
}

两者在表达效果上完全一致

逗号表达式

顾名思义,逗号隔开的一串表达式

1
2
3
4
5
6
7
8
9
int main()
{
int a = 0;
int b = 3;
int c = 5;
int d = (a=b+2,c=a-4,b=c+2);
printf("%d\n", d);
return 0;
}

结果是3

因为逗号表达式的执行逻辑是,从左向右依次计算,整个表达式的结果就是最后一个表达式的结果

下引用标操作符

1
2
3
4
5
6
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n", arr[5]);
return 0;
}

arr[ ]中的[ ]就是下标引用操作符

函数调用操作符

1
2
3
4
5
int main()
{
printf("hehe\n");
return 0;
}

printf后的( )就是函数调用操作符

不同的是,函数调用操作符可以存在多个操作数