C-操作符
操作符种类
在C语言中,操作符有以下几种:
算术操作符
移位操作符
位操作符
逻辑操作符
条件操作符
逗号表达式
下标引用,函数调用
拓展:整型提升
我们介绍常用的几个
算术操作符
+(加),-(减),*(乘),/(除),%(取余操作符)
我们直接看列子
#include<stdio.h>
int main()
{
int a = 5;
int b = 5;
printf("%d\n", a + b);
printf("%d\n", a - b);
printf("%d\n", a * b);
printf("%d\n", a / b);
printf("%d\n", a % b);
return 0;
}
这里我们需要特别注意的是/(除号)跟%(取余操作符)
“%”取的是余数
“/”取的是整除的结果
移位操作符(不可以进行负数移动并且只能是整数)
针对的是转化后的二进制:
“<<”左移操作符,左边舍去一位,右边补0
“>>”右移操作符,左边用0补充,右边舍弃一位
来看左移操作符列子:
#include<stdio.h>
int main()
{
int a = 10;
printf("%d\n", a << 1);
return 0;
}
先将10转化为二进制,然后左移一位,右边补0,得到20
右操作符与左操作符原理一样
位操作符
“&”按位与,计算规则:有0为0,两个都是1才是1
“|”按位或,计算规则:有1为1,两个同时为0才是0
“^”按位异或,计算规则:相同为0,相异为1
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 2;
printf("%d\n",num1 & num2);//第一个
printf("%d\n",num1 | num2);//第二个
printf("%d\n",num1 ^ num2);//第三个
return 0;
}
面试题目:
不创建第三个变量,来交换两个变量的值
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d b = %d\n", a, b);
return 0;
}
上面图的下面红色字是计算思路
赋值操作符
“=”一个等号就是赋值
这里延伸复合赋值操作符,就是有两个操作符组成,右边是等号,左边是一个操作符
“<=”,a <= b
“+=”,a+=b,就是a=a+b
……
单目操作符
“!”逻辑反操作
“-”负值
“+”正值
“&”取地址
“sizeof”求操作数长度,以字节为单位
“*”通常用在指针中
“++”加加,a++(先使用,再加一),++a(先加一,再使用)
“--”减减,同加加同理
展示
#include <stdio.h>
int main()
{
int a = -10;
int* p = NULL;
printf("%d\n", !2);
printf("%d\n", !0);
a = -a;
p = &a;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);
return 0;
}
sizeof和数组
首先看列子:
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)
}
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));//(1)
printf("%d\n", sizeof(ch));//(3)
test1(arr);
test2(ch);
return 0;
}
如果将数组传过去进行sizeof求大小,那么求的只是那个指针的大小,不区分char,int类型
在“X86”环境中求的是4,在“X64”环境中求的是8
关系操作符
“>” 大于
“<”小于
“>=”大于等于
“<=”小于等于
“!=”不等于
“==”判断相等
逻辑操作符
“&&” 并且,必须要所有条件满足计算才会停下来,否则返回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++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
a=1,b=2,c=3,d=4
因为a=0,代入表达式,0为假,计算停止,后面的表达式也就不再继续
条件操作符
(ese ? es1 : es2),首先计算ese表达式,如果为真,答案就是es1,如果为假,答案就是es2
逗号表达式
(es1,es2,es3,es4,es5) 从左到右,依次进行,整个表达式,是最后一个表达式的结果,碰到假的表达式就跳过
下标引用,函数调用
下标引用(数组下标从0开始),如果有10个元素,最后一个元素的下标是9
int arr[10];//创建数组
arr[9] = 10;//实用下标引用操作符。
函数调用(就是调用一个函数)
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //实用()作为函数调用操作符。
test2("hello bit.");//实用()作为函数调用操作符。
return 0;
}
整型提升
#include<stdio.h>
int main()
{
char a = 3;
char b = 127;
char c = a + b;
printf("%d\n",c );
return 0;
}
我们来看解析: