上一章我讲解了c语言的操作符类型里面前四类的基本用法以及一些使用场景,这一章为操作符篇的完结篇,会讲到其他剩余的六类。我们先回顾一下操作符的全部分类。
目录
操作符分类:
1、算数操作符
2、移位操作符
3、位操作符
4、赋值操作符
5、单目操作符
6、关系操作符
7、逻辑操作符
8、条件操作符
9、逗号表达式
10、下标引用、函数调用和结构成员
单目操作符:
单目操作符:
单目操作符就是只有一个操作数的操作符,c语言中大概有以下几种。
! 逻辑反操作符
+ 正值操作符
- 负值操作符
& 取地址操作符
sizeof 计算操作数的类型长度(以字节为单位)
~ 对一个数的二进制位取反操作
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
1、“ !”:这个为逻辑反操作符,大多都用与做于判断语句中。
int main()
{
int flag = 3;
//flag为真进入if语句
if (flag)
{ }
//flag为假进入if语句
if(!flag)
{ }
return 0;
}
当表达式为真时加上“ !”则表达式变为假,如果表达式为假则变为真。
2、" +、- ”:正值和负值的操作符,用来表示数的正负的操作符,但是正值操作符不会改变量的正负,而负值操作符会改变值的正负。
3、" & ":取地址操作符,用来取出变量的地址,而变量的地址在每次程序执行结束后下一次执行程序的时候地址都会改变。
int a = 10;
printf("%p\n", &a);
int* p = &a;
4、“ sizeof ”:计算操作数长度的操作符(单位字节)。它不是库函数,而是一个操作符,用来计算操作数的长度,也可以用来计算类型的长度以及地址的长度。
int main()
{
int arr[5] = { 0 };
printf("%d\n", sizeof(arr));
int a = 10;
int n = sizeof(a);//计算的是a所占内存的大小,单位是字节
int n = sizeof(int);
//sizeof是一个操作符
//计算的是变量所占空间的大小
//计算类型所创建的变量占据空间的大小,单位是字节
sizeof只是操作符不是函数
printf("n = %d/n", n);
return 0;
}
5、“ ~ ”:按位取反操作符,使用他会对操作数的二进制进行按位取反。
int main()
{
int a = 0;
//~是按二进制位去反
//00000000000000000000000000000000 - 补码
//11111111111111111111111111111111 -> ~a补码
//10000000000000000000000000000001 -> ~a原码
//-1;
printf("%d\n", ~a);
int a = 3;
printf("%d\n", ~a);
//00000000000000000000000000000011
//11111111111111111111111111111100 - 补码
//10000000000000000000000000000100 - 原码
int a = 13;
a |= (1 << 1);
printf("%d\n", a);
//00000000000000000000000000001101
//00000000000000000000000000000010
1 << 1;
//00000000000000000000000000001111
int a = 13;
a |= (1 << 4);
printf("%d\n", a);//a=29
a &= (~(1 << 4));
printf("%d\n", a);
//00000000000000000000000000011101
//11111111111111111111111111101111
return 0;
}
我们可以用这个操作符来实现对数组的二进制的操作,在很多场景中都有使用。
6、“ 前置、后置++,前置、后置-- ”:这两个操作符用途非常的广,就是对数字的加减操作,分前置与后置的区别。前置++、--是先使用数字或变量再进行++和--的操作,而后置则是先进行++、--的操作之后再去使用。
int main()
{
int a = 3;
int b = ++a;//前置++,先++,后使用
// a = 4,b = 4
int b = a++;//后置++,先使用,再++
// a = 4 ,b = 3
printf("%d\n", a);
printf("%d\n", b);
int a = 3;
int b = --a;//前置--,先--,再使用
//a = 2, b = 2
int b = a--;//后置--,先使用,再--
//a = 2 ,b = 3
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
7、“ * ”:解引用操作符,是一个运用在指针地址上的操作符。对指针地址进行解引用操作,也就是对指针地址所指向的值进行操作。
int main()
{
int a = 10;
int* p = &a;
*p = 20;
printf("%d", a);
return 0;
}
8、“ (类型) ”:强制类型转换操作符,是用来对某些值需要转换成其他类型的时候进行运用的。比如我们在使用time库函数进行生成随机数的时候,就需要用到我们将time()函数的返回值给rand时,就要把这个返回值强制类型转换为unsignedint类型的数。
int main()
{
int a = (int)3.14;//可以将3.14强制类型转换为int类型
printf("%d\n", a);
return 0;
}
关系操作符:
关系操作符:就是将两个表达式进行比较的操作符。
>、<、==、>=、<=,这五种,需要注意的是等于的关系表达式是两个等于,并不是一个等于,易与赋值操作符搞混。还有就是,关系表达式不能比较字符串以及字符数组。
int main()
{
if(3 == 5)
{ }
if("asdff" == "dfafaf")//字符串不能这样比较,这样比较的是字符串首字母的地址
{ }
//比较字符串要用库函数strcmp来比较
return 0;
}
逻辑操作符:
逻辑操作符:
&&:逻辑与操作符,两边表达式都为真才为真,否则为假.为真值为1,为假值为0;
||:逻辑或操作符,两边表达式有一边为真即为真,全为假才是假。为真值为1,为假值为0;
计算中&& 左边为假,右边就不计算了。|| 左边为真,右边就不计算了。
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a = %d\nb = %d\nc = %d\nd=%d\n", a, b, c, d);
//结果为1,2,3,4。因为a++先使用a的值再++,a为0所以表达式为0后面的计算都不执行。
return 0;
}
条件操作符:
条件操作符:exp1 ? exp2 : exp3。
表达式1为真,表达式2计算,表达式3不计算表达式1为假,表达式2不计算,表达式3计算。
int main()
{
int a = 3;
int b = 0;
if (a > 5)
b = 3;
else
b = -3;
//可改为下面这两种写法,都可以。
(a > 5) ? (b = 3) : (b = -3);
b = (a > 5 ? 3 : -3);
//三目操作符不建议写的过于复杂,多重嵌套。
//三目操作符还可以用来取较大值或较小值。
int max = (a > b ? a : b);
int mio = (a < b ? a : b);
return 0;
}
逗号表达式:
逗号表达式:是只讲几个表达式用逗号隔开的一个合在一起的表达式,一般是从左往右依次计算后,逗号表达式的结果为最后一个表达式的结果。
应用场景如下:
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
//c = 13。
//
//这里的if语句只会根据逗号表达式中第三个表达式的结果进行判断,但是前面两个表达式依旧会进行计算。
//if(a =b+1,c = a/2,d > 0)
//下面这段代码中,循环外和循环内有重复的执行语句。可以用逗号表达式进行改进。
a = get_val();
count_val(a);
while (a > 0)
{
a = get_val();
count_val(a);
}
//改进后
while (a = get_val(), count_val(a), a > 0)
{
;
}
return 0;
}
下标引用操作符:
下标引用操作符:[ ],用于数组中定位数据的操作符。有两个操作数,我们一般是方括号外为数组名,数组内为数组内数据的下标。
int main()
{
int arr[10] = { 0 };
arr[7] = 8;
//其中[]为下标引用操作符,操作数为arr和7。
//aar[7] --> 可以写成*(arr+7)。
//arr是数组arr首元素的地址+7就是跳过7个元素,指向第8个元素。
//*(arr+7)就是第8个元素。
return 0;
}
以上就是c语言中所以要用到的操作符,内容并不多但是需要程序员对其特性充分的了解,才能在运用过程中不出纰漏。其中这些操作符还有很多进阶的使用技巧,比不是只有以上介绍的几种使用方法。