C语言操作符有些什么
先给他们分个类好吧:
- 算术操作符:+ , -, *, /,%
- 移位操作符:<< 表示左移操作符, >> 表示右移操作符
- 位操作符:&表示按位与(都为1才为1),|表示按位或(有一个1则为1),^表示按位异或(相同为0,不同为1)
- 赋值操作符:= , +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=
- 单目操作符: (!表示逻辑非),(-表示负号),(+表示正号),(&表示取地址),(~表示对一个数的二进制按位取反)(-- 表示前置,后置--),(++表示前置,后置++),(*表示间接引用,解引用),(类型)表示强制类型转换,(sizeof()表示以字节为单位,测操作数的类型长度)
- 关系操作符:> , >=, <, <=, !=, ==
- 逻辑操作符: && , ||
- 条件操作符: 表达式1?表达式2:表达式3 表示若表达式1为真,则返回表达式2的值,否则返回表达式3的值
- 逗号表达式:,
- 下标引用,函数调用和结构成员:[], (), ., ->
怎么用
1.算术操作符:
这应该都会用吧,不多说了,但有以下几点需要注意:
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
2.移位操作符:
需注意的是:不可移动复数位,因为这是标准为定义的。
左移:左边抛弃,右边补0,二进制下进行。
右移:根据编译器的不同,有两种移位规则:(1)逻辑移位:左边补0,右边抛弃。(2)算术移位:左边用原该值的符号位填充,右边抛弃。
应用实例:
void show_odd_even_bits(int n){
int i = 0,j = 0;
printf("奇数位:");
for (i = 31; i >=0; i -= 2){
printf("%d ", (n>>i) & 1);//int型共32位,从左边第一位开始是奇数位的头,所以循环从31开始,先将n这个数右移31位再与1,即求出这个数n换成二进制后左边的第一位数,依次类推。
}
printf("\n");
printf("偶数位:");
for (j = 30; j >= 0; j -= 2){
printf("%d ", (n>>j) & 1);
}
printf("\n");
}
这是一个将一个数的二进制(因为数在计算机内存中以二进制形式存储,所以不需要特别转换成二进制,可以直接用)的奇数位和偶数位分别打印出来的函数。
3.位操作符
注意:他们的操作数都是整数。
应用实例1(不创建临时变量交换两个数):
#include<stdio.h>
int main(){
int a=11,b=22;
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);
return 0;
}
应用实例2(求一个整数存储在内存中的二进制中1的个数)
int NumberOf1(int n){
int count = 0;
while (n != 0){
n = n&(n - 1);// 与了几次就表示这个数的二进制下中有多少个1
count++;
}
return count;
}
4.单目操作符
这里只说一下sizeof和前置++,后置++这些个东西。
sizeof(): 编译期间 确定类型的字节大小 并且 不会参与运算。
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//输出为4
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//输出为4
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//输出为40
printf("%d\n", sizeof(ch));//输出为10
test1(arr);
test2(ch);
printf("%d\n", sizeof(int));//输出为4,也可以写成printf("%d\n", sizeof int );
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(){
int a = 10;
int b = a++;
int c = ++a;
a = a++;
printf("%d\n", b);//10 先使用a赋值给b,此时b=10,a再++为11
printf("%d\n", a);//13
++a;
a++;
printf("%d\n", c);//12
printf("%d\n", a);//15
return 0;
}
5.关系操作符
主要用于条件判断,注意=为赋值语句,==才为条件判断。
6.逻辑操作符
1. 表达式1 && 表达式2 && 表达式3,计算机是这么做的:
先判断表达式1,若为假则后面的表达式都不进行计算,直接返回0;若表达式1为真,再计算表达式2,若为假则不进行计算表达式3,返回0,若为真则再计算表达式3;若表达式3为假,则返回0,为真则返回1.
2. 表达式1 || 表达式2 || 表达式3 计算机这么做:
先判断表达式1,若为真则不计算后面的表达式2和3,若为假,再计算表达式2,若表达式2为真,则不计算表达式3,若表达式2为假,则在计算表达式3,真则返回1,假则返回0。
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++; //若注释掉上条语句,执行这条语句,则输出为a=1,b=3,c=3,d=4
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);/a=1,b=2,c=3,d=4
return 0;
}
7.条件操作符
举个例子:
判断两个数的大小,一种是正常的使用比较关系操作符,另一种是不使用比较关系操作符
int Max(int a,int b)
{
return a > b ? a : b;
}
int Func(int a,int b)//不用>,<,=等关系操作符判断两个数的大小
{
return (a-b)>>31 ? -1 : (a-b ? 1 : 0);//先判断(a-b)>>31,即判断a-b的符号为,若为1则a<b,返回-1,若为0则a>b,返回(a-b ? 1 : 0),而(a-b ? 1 : 0)表示当a-b大于0时返回1,a-b为假时(即a=b的情况)返回0
}
8.逗号表达式
int a=(表达式1,表达式2,表达式3); //每一个表达式都要计算,但a的值等于最后一个表达式的值
9.下标引用
. 结构体.成员名
-> 结构体指针->成员名
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct A
{
int a;
int b;
};
struct B
{
int c;
struct A AA;
struct A *pa;
};
int main()
{
struct B stuB;
stuB.AA.a; //结构成员访问
stuB.AA.b;
stuB.pa->a; //结构成员访问
stuB.pa->b;
stuB.c;
stuB.AA;
stuB.pa;
return 0;
}