6 单目操作符
a+b,+就是一个双目操作符,因为+两边都有数值,单目操作符就是操作符仅一个操作数
逻辑反操作(!):在C语言中,0表示假,!0表示真 。例如:10表示真,则!10输出的就是0。
此时友友们就会想,!0会不会就是任意一个数值,答案是不是的,!0的值是固定的,是1。
(! 真变成假,假变成真)
正值(+),负值(-),一个数a=10,那么+a就是10,-a就是-10;一个数b=-10,那么+b就是-10,-b就是10。
知识点:
abs(对整数取绝对值) fabs(对小数取绝对值)#include <math.h>
取地址符号(&),取地址用的,可以知道储存在内存中的地址。
操作数的类型长度(以字节为单位)(sizeof):计算的是变量或者类型所创建变量占据内存的大小。
上图中把a去掉,就是类型,sizeof(类型)也可以。int arr[10]呢?答案是也可以的
sizeof(类型)括号不可以省略,变量可以 但是中间需要一个空格
对一个数的补码的二进制按位取反(~)(0变成1,1变成0),打印的是原码
0的原码反码补码都是000000000000000000000000000000000
给一个数10 , 00000000000000000000000000001010,把倒数第三个0变成1,这个数按位或0000000000000000000000000000000100(也可以表示成1<<2)即可变成000000000000000000000000000001110
现在倒回去,把00000000000000000000000000001110的倒数第三个数字变成0,这个数按位与11111111111111111111111111011(按位取反 1<<2)即可
前置、后置++ 前置后置--
前置++:先++,后使用 后置++:先试用,后++
++a,那么结果都是11
*间接访问操作符(解引用操作符)
1. #include <stdio.h> 2. int main() 3. { 4. int a = 10;//在空间内存创建一个变量a,内存的地址叫做m, 5. int* pa = &a;//指针变量int* 创建一个变量pa存放地址m 6. *pa = 20;//通过指针找到a,用*pa,改变pa的值就是改变a的值 7. printf("%d ", a); 8. return 0; 9. }
*pa就是a,&*pa与&a相同。(不管什么元素的指针,它的大小4个字节就是8个字节,例如:不在主函数内的sizeof(ch)的值为4/8.。,char ch[10] ={0}, (×86环境——32个字节——4个字节)(×64环境——64个字节——8个字节))
强制类型转换(类型):例如,3.14是一个double类型数字,把它转换成int类型,即 (int)3.14
int b = 3.14会报错 ,为了不报错加上(int)
7 关系操作符
这个就比较简单了,就是大于,大于等于,小于,小于等于,不等于,等于(注意,判断相等,用两个等号)
8 逻辑操作符
按位与和按位或 关注二进制, 逻辑与和逻辑或只关注真假
1<a<5 这样写是错误的,如果a = 2,1<2为真,就为1,1<5为真。
因为a++为后置++,a++为1,a为2,所以逻辑或,一真就全部为真,所以++b,d++并没有计算,所以b和d仍然为2,4.所以a b c d为2 2 3 4.
总结:
&&左操作符为假,右边不计算 || 左操作为真,右边不计算
9 条件操作符
这个操作符也叫三目操作符
条件操作符就是简化if语句。exp1为真,就输出exp2, exp1为假,就输出exp3.
if语句
简化if语句
10 逗号表达式
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式会从左向右依次计算,整个逗号表达式的结果是最后一个表达式的结果。
if(a >b,c = b/2,d > 0) 这个语句中起作用的是d > 0.
11 下标引用、函数调用和结构成员
11.1 [ ] 下标引用操作符
操作数:一个数组名+一个索引值
int arr[ 10] = { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n",arr[7]);
上面的[ ]就是下标引用操作符,arr ,7 就是操作数
arr数组首元素地址,arr+7就是第8个元素的地址,*(arr+7)就是arr[ 7 ],*(arr+7)可以写成*(7+arr),那么就可以写成7[ arr ].
11.2 ( )函数调用操作符
test( )中的 函数调用操作符,在函数那个章节有详细说明,在这里就不赘述了
11.3 访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
1. #include <stdio.h> 2. struct Stu 3. { 4. char name[20]; 5. int age; 6. double score; 7. }; 8. int main() 9. { 10. struct Stu s = { "zhangsan", 20, 85.5}; 11. printf("%s %d %.1lf\n", s.name, s.age, s.score);//结构体变量.结构体成员 12. struct Stu* ps = &s; 13. printf("%s %d %.1lf\n", (*ps).name, (*ps).age, (*ps).score); 14. printf("%s %d %.1lf", ps->name, ps->age, ps->score);//结构体指针->结构体变量 15. return 0; 16. }