最近自己看了一些c的操作符,便按照自己的想法总结如下:
操作符的分类
1.算数操作符
+ 加 - 减 * 乘 / 除 % 取模
(1)%操作符只能对两个整数进行操作,返回值是整除后的余数
(2)除%操作符外,其余四个操作符均可以作用于整数和浮点数
(3)/操作符,如果两个操作数均为整数,则执行整数除法。操作数中只要有一个为浮点数,就执行浮点数除法
2.移位操作符
左移操作符 <<
*左边抛弃,右边补0
*操作数有乘2的n次方的效果
右移操作符 >>
(1)逻辑移位
*左边补0,右边丢弃
(2)算数移位
*左边补原值的符号位,右边丢弃
*对操作数有除2的n次方的效果
注:
*经过左移或右移操作之后,原数的值不发生改变,表达式的值发生改变
*对于移位操作符,不能移动负数位
3.位操作符
&按位与 |按位或 ^按位异或
应用:
例题:不创建临时变量,实现两数的交换
int main()
{
int a = 10;
int b = 20;
printf("a = %d, b = %d\n", a, b); //打印初始的两数
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d, b = %d\n", a, b); //打印交换后的两数
system("pause");
return 0;
}
输出结果为:a = 10, b = 20
a = 20, b = 10
注:
*位操作符均是对操作数的二进制位进行操作
*位操作符的操作数必须为整数
4.赋值操作符
= 赋值
*使用 = 操作符可以进行连续赋值,但是一般不建议进行连续赋值操作,因为对于同样的语义:
明显后者更加清晰易读,易于调试
复合赋值符
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
5.单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof() 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
(1)对于数组arr[],&arr为整个数组的地址,
arr为数组首元素的地址
(2)对于++和--这两个操作符,前置时:先对操作数进行操作,然后再使用操作数,
后置是:先使用操作数,再对操作数进行操作
(3)对强制类型转换的使用,例:
int main()
{
int a = (int) 3.14;
printf("%d\n", a);
return 0;
}
强制转换之后,将3赋给了a。
6.关系操作符
>
>=
<
<=
!=
==
注:
*注意在编程过程中,不要将==和=写错,导致错误。
7.逻辑操作符
&& 逻辑与
|| 逻辑或
注:
*两者的特点:
在逻辑与过程中,遇假停;
在逻辑或过程中,遇真停。
8.条件操作符
exp1 ? exp2 : exp3
例:使用条件表达式求两数中的最大数:
a > b ? a : b
9.逗号表达式
exp1,exp2,exp3, ...expN
例:以下代码:
int a = 1
int b = 2
int c = (a>b, a=b+10, a, b=a+1)
求得c值为:13。
注:
逗号表达式在执行过程中,从左到右依次执行,整个表达式的结果是最后一个表达式的结果。
10.下标引用,函数调用和结构成员
下标引用 [ ]
操作数:一个数组名 + 一个索引值
int arr[10] = 0;
arr[2] = 10;
函数调用 ( )
可接受一个或者多个操作数:第一个操作数为函数名,剩余的操作数为传递给函数的参数。
#include <stdio.h>
void test1()
{
printf("haha\n");
}
void test2(const char* str)
{
printf("%s\n", str);
}
int main()
{
test1();
test2("hello");
return 0;
}
访问一个结构的成员
两种方法: 结构体.成员名
结构体指针->成员名
#include <stdio.h>
#include <string.h>
struct Stu
{
int age;
char name[20];
};
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;
stu.age = 10;
printf("age:%d\n", pStu->age);
strcpy(pStu->name, "zhangsan");
printf("name:%s\n", stu.name);
return 0;
}
输出结果为:age:10
name:zhangsan
或许还有很大的不足,还望各位可以指出,本人小白,希望可以和各位相互探讨一下有关c的知识^_^。