c语言操作符总结(二)

单目操作符


这里重点讲解sizeof , ~ , 前置 , 后置加加和减减操作符

1. sizeof

#include<stdio.h>
int main()
{
    
    
	int a = 10;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));
	int arr[10] = {
    
     0 };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(int[10]));
	int arr2[5] = {
    
     0 };
	printf("%d\n", sizeof(arr2));
	printf("%d\n", sizeof(int[5]));
	// 运行结果 4 4 40 40 20 20
}

下面来看一道题

#include<stdio.h>
int main()
{
    
    
	short s = 3;
	int a = 10;
	printf("%d\n", sizeof(s = a + 5));
	printf("%d\n", s);
}

大家觉得这道题的结果是什么呢?我们来分析一下.

我们将a + 5得到的整形存到s短整型里,会发生截断,因此sizeof所测得的是一个短整型变量的大小,即2个字节

同时我们要强调一点,sizeof括号里放的表达式是不计算的

因为sizeof(s = a + 5)在编译期间就已经变成了2,我们运行进行打印时相当于

printf("%d\n",2);
printf("%d\n",s);

因此该题结果为2 3

2. ~

~ : 按二进制位(补码)取反

#include<stdio.h>
int main()
{
    
    
	int a = 0;
	printf("%d", ~a);
}
// 输出结果为 -1

0的补码: 00000000000000000000000000000000
按位取反(补码) : 11111111111111111111111111111111
减1 : 11111111111111111111111111111110
取反 : 10000000000000000000000000000001

(1) ~的应用

我们如果想将二进制的某一位改成1,以a = 13 的第二位为例

00000000 00000000 00000000 00001101
00000000 00000000 00000000 00000010 按位或操作
00000000 00000000 00000000 00001111

a | (1<<1)

如果想将二进制的某一位改成0,以a = 13 的第二位为例

00000000 00000000 00000000 00001111
111111111 111111111 111111111 11111101 按位与操作
00000000 00000000 00000000 00001101

a & (~(1<<1))

3.前置 , 后置加加和减减

//++和--运算符
//前置++和--
 //前置++和--:
 #include <stdio.h>
 int main()
 {
    
    
 int a = 10;
 int x = ++a;
 //先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。
 int y = --a;
 //先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10;
 return 0;
 }
 
 //后置++和--
 #include <stdio.h>
 int main()
 {
    
    
 int a = 10;
 int x = a++;
 //先对a先使用,再增加,这样x的值是10;之后a变成11;
 int y = a--;
 //先对a先使用,再自减,这样y的值是11;之后a变成10;
 return 0;
 }

关系运算符

 >
>=
 <
<=
!=   用于测试“不相等”
==      用于测试“相等

逻辑操作符

&& 逻辑与
|| 逻辑或

下面看一道笔试题

#include <stdio.h>
int main()
{
    
    
    int i = 0,a=0,b=2,c =3,d=4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
} 

是不是有很多人认为是 1 3 3 5 呢? 实际上结果为1 2 3 4,这涉及到了短路操作。

&& 左边如果为假,右边不再计算

a++ 先使用a的值为0,计算结果为假,后面的表达式都不再计算。

|| 左边如果为真,右边不再计算

条件操作符(三目操作符)

exp1 ? exp2 : exp3

当表达式1结果为真时,计算表达式2的值,当当表达式1结果为假时,计算表达式3的值。

例:使用条件表达式实现找两个数中较大值

int a = 30;
int b = 40;
int max = (a > b) ? (a) : (b);

逗号表达式

exp1, exp2, exp3, …expN

逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);
// c的值为13

猜你喜欢

转载自blog.csdn.net/DR5200/article/details/113186838