目录
赋值操作符 = += -= *= /= &= ^= |= >>= <<=
单目操作符 ! - + & sizeof ~ -- ++ * (类型)
条件操作符(三目操作符) exp1 ? exp2 :exp3
算术操作符 + - * / %
移位操作符 << >>
位操作符 & ^ |
& 按2进制位与
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int a = 3; int b = 5; int c = a & b; printf("%d\n", c); return 0; }
a=00000000 00000000 00000000 00000011 //int占位为4字节
b=00000000 00000000 00000000 00000101
c=00000000 00000000 00000000 00000001=1 //有0出0,全1出1
^ 按2进制位异或
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int a = 3; int b = 5; int c = a ^ b; printf("%d\n", c); return 0; }
a=00000000 00000000 00000000 00000011 //int占位为4字节
b=00000000 00000000 00000000 00000101
c=00000000 00000000 00000000 00000110=6 //相同为0,不同为1
| 按2进制位或
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int a = 3; int b = 5; int c = a | b; printf("%d\n", c); return 0; }
a=00000000 00000000 00000000 00000011 //int占位为4字节
b=00000000 00000000 00000000 00000101
c=00000000 00000000 00000000 00000111=7 //有1出1
赋值操作符 = += -= *= /= &= ^= |= >>= <<=
int a = 10;//创建变量a,且初始化为10,初始化操作 a = 20;//赋值操作 a = a + 10;//可以写成a+=10 a = a - 8;//a-=8
单目操作符 ! - + & sizeof ~ -- ++ * (类型)
单目即只有一个操作数
! 逻辑反操作
int a = 10; printf("%d\n", !a);//逻辑反操作,输出0 int a = 0; printf("%d\n", !a);//逻辑反操作,输出1
if(!a) //a为假,进入if语 //非0是真,0是假
- 负值 + 正值
区别于+(加号):a+b,a和b是+的两个操作数,+称为双目操作符
& 取地址
sizeof 操作数的类型长度(以字节为单位)
int a=10; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(int));//两种写法一样
~ 对一个数的二进制按位取反
整数在内存中存储的时候,存储的是二进制,表示形式有3种:原码,反码,补码
有符号的整数,最高位是0,表示正数;最高位是0,表示负数
正的整数,原码=反码=补码;
负的整数,反码=原码符号位不变,其他位按位取反;补码=反码的二进制+1
内存中存储的是二进制的补码,计算的时候采用的也是补码
-- 前置--、后置--
++ 前置++、后置++
++a 前置++:先++,后使用
a++ 后置++:先使用,后++
int a=2; int b=(++a)+(++a)+(++a);//a=a+1 a+=1 printf("%d",b);
VS2019运行结果为12, Linux运行结果是10,尽量不写上述计算表达式,容易引起错误
(类型) 强制类型转换
int a=3.14;//3.14默认double类型,占8字节,输出会有警告 int a=(int)3.14;//把3.14强制转化为int类型,不会生成警告
尽量避免这种操作
关系操作符 > >= < <= != ==
= 用来赋值
== 用来判断相不相等,大小是否一致
逻辑操作符 || &&
- && 逻辑与
- || 逻辑或
int a=3; int b=4; if((a==3)&&(b==4))//a=3并且b=4,则输出哈哈 { printf("哈哈\n"); } if((a==3)||(b==4))//a=3或者b=4,则输出呵呵 { printf("呵呵\n"); }
(a==3) 加括号是为了更方便的看出逻辑关系
条件操作符(三目操作符) exp1 ? exp2 :exp3
int a = 10; int b = 0; if (a == 5) { b = -6; } else { b = 6; }
b=((a==5)?-6:6);
以上两种编程语句表达的意思是一样的
逗号表达式 exp1,exp2,exp3……expn
int a=0; int b=3; int c=-1; int d=(a=b-5,b=a-c,c=a+b,c-=5);
a=-2 b=-3 c=-5 c=-10 → d=-10
逗号表达式会从左向右依次计算,整个逗号表达式的结果是最后一个表达式的结果
下标引用,函数调用和结构成员 [ ] () . ->
[ ]下标引用操作符
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int arr[10] = { 0,1,2,3,4,5,6,7,8,9 }; printf("%p\n", &arr[4]); printf("%p\n", &4[arr]); //printf("%p\n", &[arr]4);//Err //printf("%p\n", &[4]arr);//Err return 0; } //[]是操作符,它的两个操作数为arr和4
() 函数调用操作符
void test1() { printf("hehe\n"); } void test2(const char str[]) //const int *A; //const修饰指向的对象,A可变,A指向的对象不可变 //int const* A; //const修饰指向的对象,A可变,A指向的对象不可变 //int* const A; //const修饰指针A, A不可变,A指向的对象可变 //const int* const A;//指针A和A指向的对象都不可变 { printf("%s\n", str); } int main() { test1(); test2("hello bit."); return 0; }
. 和 ->用于访问一个自定义成员
两段代码等价,-> 可以理解为通过pb指针先找到b,然后再找到name
结构体
打印功能
- 方法一
出错原因是定义结构体Book在函数print1之后,只要调换顺序即可解决
struct Book//自定义类型 { char name[20]; float price; char id[10]; }; //结构体用于描述一个复杂对象 void print1(struct Book b) { printf("书名:%s\n", b.name); printf("价格:%f\n", b.price); printf("书号:%s\n", b.id); } int main() { struct Book b = { "C语言程序设计",55.5f,"C20211108" }; print1(b); return 0; }
- 方法二:利用结构体指针打印内容
方法三:利用 ->,先通过pb找到b,再找到name
改变结构体内的部分内容
- 方法一
上面的代码利用结构体类型struct Book创建了一个变量是struct Book b,b中有三个成员:name,price,id,在上述代码基础上,想要改变价格,可做如下改动
- 方法二:strcpy
而想要改书名为数据结构的时候,添加 b.name="数据结构"; ,系统会报错。因为name是一个数组名,代表一个地址常量,而“数据结构”应该放到地址所指向的空间中。可以利用strcpy
希望大家多多批评指正!