C语言各种操作符透彻理解下篇
1.单目操作符
之前有了解到的三目操作符(?:),指的是有三个操作数
例如:3+5
其中,+是一个操作符
3是左操作数
5是有操作数
+则是一个双目操作符
那么什么是单目操作符呢,也就是只有一个操作数的
我们常见的操作符有:
这里我们来详细介绍一下sizeof、~、++与--
1.sizeof
sizeof常用来计算类型的长度,比如数组类型,int、char、short等等。同时,sizeof是操作符,不是函数,所以后面的括号可以省略。但算类型长度的时候不能省,这是语法要求。
下面就是sizeof一些常用的用法
#include<stdio.h> int main() { //sizeof int a = 10; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof(float)); printf("%d\n", sizeof(double)); int arr[10] = { 1,2,3,4,5,6,7 }; printf("%d\n", sizeof(arr)); printf("%d\n", sizeof(int[10]));//计算整个数组的长度 printf("%d\n", sizeof a); //printf("%d\n", sizeof int);这样写是会报错的 return 0; }
计算出的结果如下:
2.~
~的主要作用就是对一个数的二进制按位取反,但同样的,最后打印出来的是原码
#include<stdio.h> int main() { int a = 0; //~按(内存中补码的2进制)位取反 //00000000000000000000000000000000 //11111111111111111111111111111111 - 补码 //11111111111111111111111111111110 - 反码 //10000000000000000000000000000001 - 原码 --> -1 printf("%d\n", ~a); return 0; }
运行结果如下:
这里有个~的应用:
怎样将一个数进行复原
#include<stdio.h> int main() { int a = 10; a |= (1 << 2); printf("%d\n", a); a &= ~(1 << 2); printf("%d\n", a); return 0; //如果只想把倒数第三个数,也就是0改为1,可以进行以下操作 //00000000000000000000000000001010 //00000000000000000000000000000100 1<<2(用a与1<<2异或来实现) //00000000000000000000000000001110 //11111111111111111111111111111011 ~(1<<2)(要想将a复原,就是再将倒数第三个数变为0) //00000000000000000000000000001010 }
3.++与--
这里主要注意的是分前置与后置
前置++/--:先加/减再使用
后置++/--:先使用再加/减
a每加一次就会记录,总共加了两次,所以是3。
对于b,先使用了a的值再对a进行++,所以是1.
到c这里,a实际上已经变成2了,而c是先对a进行加1再用它的值,所以c为3。
4.*(解引用操作符)
#include<stdio.h> int main() { int a = 10; int* pa = &a; *pa = 20;//通过*来访问a的地址 printf("%d\n", a); printf("%d\n", *pa);//此时的*pa就是a的值 int* px = &*pa;//px通过*来访问*pa,也就是访问a *px = 30; printf("%d\n", a); return 0; }
2.关系操作符
3.逻辑操作符
(只关注变量的真假)
来看一道360的笔试题,判断一下程序输出的结果是多少。
我们先来看下第一种,a是先使用再进行++,这里a是0,是0则为假,那么后面的就都不要看了,还是原来的结果,但a进行了++
再看第二种,先打个比方,我想让张三或者李四,一个来我办公室,张三来了,那李四来不来就已经无所谓了,这里也是一样,a先使用再++,则a=0,表示没有人来,没人来就继续进行,b是先++再使用,b=3,为真,就是有人来了,有人来了以后,后面的来不来都无所谓,所以d就不再进行,最后输出的结果就是1334.
(做个小总结:&&---左操作数为假,右边不计算 ||---左操作数为真,右边不计算)
4.条件操作符
(也叫三目操作符--->exp1 ? exp2 : exp3 )
#include<stdio.h> int main() { int a = 10; int b = 20; int max = 0; /*if (a > b) max = a; else max = b;*/ max = (a > b ? a : b);//与上面那段代码等价 return 0; }
5.逗号表达式
逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式从左向右依次执行。整个表达式的结果是最后一个表达式的结果。 首先,我们来分析一个代码: 下面输出的c是多少?
int a = 1; int b = 2; int c = (a > b, a = b + 10, a, b = a + 1);
我们来看括号里面的式子,像a>b、a这样子的对a和b毫不起作用,可以直接忽略掉,然后a=b+10,这里a变成了12,最后b=a+1=13.所以结果是13.
不难发现,最后起作用的是最后一个表达式的结果。
6.下标引用、函数调用和结构成员
1. [ ] 下标引用操作符
操作数:一个数组名+一个索引值
2.( )函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
#include<stdio.h> void menu() { printf("*************************\n"); printf("****** hello ******\n"); printf("****** friends ******\n"); printf("*************************\n"); } int main() { menu(); return 0; }
3.访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
#include<stdio.h> struct Stu { char name[10]; int age; double score; }; int main() { struct Stu s = { "zhangsan",20,85.5 }; //. printf("%s %d %.1lf\n", s.name, s.age, s.score); //-> struct Stu* ps = &s; printf("%s %d %.1lf\n", (*ps).name, (*ps).age, (*ps).score); printf("%s %d %.1lf\n", ps->name, ps->age, ps->score); return 0; }
这三种情况输出的结果一样,感兴趣的同学可以自己去试一下!
7.隐式类型转换
例如:
#include<stdio.h> int main() { short s = 20; int a = 5; printf("%d\n", sizeof(s = a + 4)); printf("%d\n", s); return 0; }
sizeof输出的结果是2,这里面int型的a被转化为short型。
8.操作符的属性
复杂表达式的求值有三个影响的因素:
1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序
两个相邻的操作符先执行哪个,取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
// 表达式的求值部分由操作符的优先级决定。
// 表达式 1
a * b + c * d + e * f
在计算的时候,由于*比+的优先级高,只能保证,*的计算是比+早,但是优先级并不
能决定第三个 * 比第一个 + 早执行。
// 表达式2
c + -- c ;
同上,操作符的优先级只能决定自减-- 的运算在 + 的运算的前面,但是我们并没有办法得 知,+操作符的左操作数的获取在右操作数之前还是之后求值,所以结果是不可预测的,是有歧义 的。
// 代码 3- 非法表达式
int main ()
{
int i = 10 ;
i = i -- - -- i * ( i = - 3 ) * i ++ + ++ i ;
printf ( "i = %d\n" , i );
return 0 ;
}
我们在写代码的时候,难免会为一些小细节而头痛,只有在我们熟练掌握这些知识的时候才能避免这些尴尬的小问题,希望操作符详解能对你有些帮助!
到此这篇关于C语言各种操作符透彻理解下篇的文章就介绍到这了,更多相关C语言 操作符内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!