目录
例题:交换俩个int变量的值,不能使用第三个变量,即a=3,b=5,交换之后a=5,b=3
1.算数操作符
+ - * / %
2.移位操作符
其中可能需要原码反码补码的知识请前往学习。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//移位操作符有 << >>
int main()
{
int a = 2;
//把a的二进制位向左移动一位
//2(00000000 00000000 00000000 00000010)
//左移后2<<1(00000000 00000000 00000000 00000100)
int b = a << 1;
printf("%d\n",b);
int c = 10;
//把a的二进制位向左移动一位
//10(00000000 00000000 00000000 00001010)
//右移后10>>1(00000000 00000000 00000000 00000101)
b = c >> 1;
printf("%d\n", b);
int d = -1;
//把a的二进制位向左移动一位
//-1(10000000 00000000 00000000 00000001)
//左移后-1>>1(10000000 00000000 00000000 00000001)要用到原码反码补码的知识
b = d >> 1;
printf("%d\n", b);
}
3.位操作符
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//位操作符 &按位与 |按位或 ^按位异或
int main()
{
int a = 1;
int b = 5;
// &---按位(二进制位)与
int c = a & b;
//a(00000000 00000000 00000000 00000001)
//b(00000000 00000000 00000000 00000101)
//c(00000000 00000000 00000000 00000001)
printf("%d\n",c);
a = 3;
b = 5;
// |---按位(二进制位)或
c = a | b;
//a(00000000 00000000 00000000 00000011)
//b(00000000 00000000 00000000 00000101)
//c(00000000 00000000 00000000 00000111)
printf("%d\n", c);
a = 3;
b = 5;
// ^---按位(二进制位)异或 规则:相同为0,相异为1
c = a ^ b;
//a(00000000 00000000 00000000 00000011)
//b(00000000 00000000 00000000 00000101)
//c(00000000 00000000 00000000 00000110)
printf("%d\n", c);
return;
}
例题:交换俩个int变量的值,不能使用第三个变量,即a=3,b=5,交换之后a=5,b=3
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
//b^b=0;
//b^0=b;
printf("%d %d",a,b);
return;
}
4.赋值操作符
+= -= *= /= %= >>= <<= &= |= ^=
5.单目操作符
! - + sizeof ~ -- ++ &(取地址) *(间接访问操作符) (类型)强制类型转化 注:只有一个操作数
对于“~”操作符有单独的介绍。操作符“~”与原码反码补码的详解
这里只介绍&(取地址) *(间接访问操作符) (类型)强制类型转化 操作符。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 3;
printf("%p\n",&a);
//&取地址操作符(当他只有一个操作数时,他表示取地址操作符,有俩个操作数,表示按位与操作符)
int * pa = &a;//pa是用来存放地址的,pa就是一个指针变量(注:这里的*表示告诉我们pa是指针变量)
*pa = 20; //*解引用操作符 - 间接访问操作符(注:这里的*是解引用---操作符)
//*pa用大白话来说就是,pa里存的是地址,解地址的意思就是通过pa的地址找到这个地址里存的东西
printf("%d",a);
int b =(int)3.14;//强制类型转化将浮点型3.14强制转换为int型
printf("%d", b);
return;
}
6.关系操作符
> < >= <= == !=
只需注意比较字符串不能使用“==”
7.逻辑操作符
&&(逻辑与) ||(逻辑或)
做题理解一下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a=%d\tb=%d\tc=%d\td=%d\n",a,b,c,d);
i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf("a=%d\tb=%d\tc=%d\td=%d\n", a, b, c, d);
i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;
printf("a=%d\tb=%d\tc=%d\td=%d\t", a, b, c, d);
return;
}
8.条件操作符
条件操作符也叫三目操作符
表达式1?表达式2:表达式3 表达式1为真输出表达式2,表达式1位假输出表达式3
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int max=(a >b ? a : b);//如果a>5为真把1赋值给b,如果a>5为假吧-1赋值给b
printf("%d",b);
return;
}
9.逗号操作符
用逗号隔开的多个表达式
注:逗号表达式 - 要从左向右依次计算,整个表达式的结果是逗号表达式中最后一个表达式的结果,但是最后一个表达式的结果可能受前面表达式的影响
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a ;
int b ;
int c ;
int d ;
int e = (a=2,b=3,c=a+4,d=c+5);
//逗号表达式 - 要从左向右依次计算,但是整个表达式的结果是逗号表达式中最后一个表达式的结果
printf("c=%d\te=%d\t",c,e);
return;
}
实例: 用逗号表达式写可以避免冗余。
//常规代码
a = get_val();
count_val(a);
while (a > 0)
{
a = get_val();
count_val(a);
}
//用逗号表达式写
while (a=get_val(),count_val(a),a>0)
{
}
10.下标引用,函数调用和结构体成员
下标引用与函数调用,对于一维数组和二维数组的详细讲解与实例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//函数的定义
int Add(int x, int y)
{
return x + y;
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//这里的[]是指定数组大小的语法格式,不是操作符
printf("arr[2]=%d\n",arr[2]);
// []下标引用操作符
// []的操作数有俩个:(数组名)arr和(索引值)2
int a=3;
int b=2;
int ret=Add(a, b);
// ()--函数调用操作符
// ()操作数是3:函数名Add和参数a,b 如果没有参数操作数就是1:函数名
printf("ret=%d\n",ret);
return;
}
结构体成员
对于结构体成员的操作符有俩种
结构体.成员名
结构体指针->成员名
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct Book //用struct可以定义一个新的结构体
{
//结构体成员(变量)
char name[20];
char ID[20];
int price;
};
int main()
{
struct Book b = { "C语言","1119","55" };
printf("书名:%s\n", b.name);
//这里b是结构体变量
//访问一个结构成员格式:结构体.成员名
printf("书号:%s\n", b.ID);
printf("单价:%d\n", b.price);
struct Book c = { "数据结构","1214","60" };
struct Book * pb = &c;//存储的c的地址
printf("书名:%s\n", (*pb).name);//对pb进行解引用即*pb=c
printf("书号:%s\n", (*pb).ID);
printf("单价:%d\n", (*pb).price);
//结构体指针->成员名
printf("书名:%s\n", pb->name);//对pb进行解引用即*pb=c
printf("书号:%s\n", pb->ID);
printf("单价:%d\n", pb->price);
return;
}
11.隐式类型转化
(1)整型提升
如果对原码反码补码不了解,请先学习原码反码补码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char a = 3;
//3 - 00000000 00000000 00000000 00000011
//a - 00000011
char b = 127;
//127 - 00000000 00000000 00000000 01111111
//b - 01111111
char c = a + b;
//a+b时需要整型提升(有符号的类型,整型提升时高位补的是符号位。无符号类型,补0)
//a - 00000000 00000000 00000000 00000011
//b - 00000000 00000000 00000000 01111111
//c - 00000000 00000000 00000000 10000010
//char c - 10000010
printf("%d",c);
//因为要输出的是整型而c是char类型又需要整型提升
//11111111 11111111 11111111 10000010 - 补码
//11111111 11111111 11111111 10000001 - 反码
//10000000 00000000 00000000 01111110 - 原码
//所以%d输出的是-126
return;
}