基础运算符号
1 、C语言运算符号种类
1.1、算术运算符
用于各类数值运算。包括:加(+)、减(-)、乘(*)、除(/)、求余(或称模运算) (%)、自增(++)、自减(–)共七种。
加号运算符
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 12;
int b = 20;
int c = a + b;
printf("c=%d",c);
return 0;
}
减号运算符
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 12;
int b = 20;
int c = a - b;
printf("c=%d",c);
return 0;
}
乘号运算符
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 12;
int b = 20;
int c = a * b;
printf("c=%d",c);
return 0;
}
除号运算符
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 12;
int b = 20;
int c = a / b;
printf("c=%d",c);
return 0;
}
取余运算符
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 12;
int b = 20;
int c = a % b;
printf("c=%d",c);
return 0;
}
自增运算符
1.前置++运算符
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 12;
int b = ++a; //int a= a+1; int b = a;
printf("b=%d",b);
return 0;
}
2.后置++运算符
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 12;
int b = a++; //int b = a; a=a+1;
printf("b=%d\n", b);//调试结果b=12;
printf("a=%d",a); //调试结果a=13;
return 0;
}
++a;说明: 操作数的值被相加,而表达式的值就是操作数增加后的值。
a++;说明: 操作数的值仍被相加,而表达式的值是操作数增加前的值。
自减运算符
1.前置--
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 12;
int b = --a; //int a= a-1; int b = a;
printf("b=%d",b);
return 0;
}
2.后置--
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 12;
int b = a--; //int b = a; a=a-1;
printf("b=%d\n", b);//调试结果b=12;
printf("a=%d",a); //调试结果a=11;
return 0;
}
--a;说明: 操作数的值被减,而表达式的值就是操作数减后的值。
a--;说明: 操作数的值仍被减,而表达式的值是操作数减前的值。
注意点:
- 在整数除法中,整数除以整数,结果还是整数,只要分子或者分母有一个小数,结果就按小数处理
- 使用求余%符号时,不能用于float和double类型,余数的符号始终与分子(被除数)的符号一致
练习:
判断一个数是否为素数
#include <stdio.h>
int main(){
int a=0; // 素数的个数
int num=0; // 输入的整数
printf("输入一个整数:");
scanf("%d",&num);
for(int i=2;i<num;i++){
if(num%i==0){
a++; // 素数个数加1
}
}
if(a==0){
printf("%d是素数。\n", num);
}else{
printf("%d不是素数。\n", num);
}
return 0;
}
#include <stdio.h>
#include <math.h>
void main(){
int m; // 输入的整数
int i; // 循环次数
int k; // m 的平方根
printf("输入一个整数:");
scanf("%d",&m);
// 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换m的类型
k=(int)sqrt( (double)m );
for(i=2;i<=k;i++)
if(m%i==0)
break;
// 如果完成所有循环,那么m为素数
// 注意最后一次循环,会执行i++,此时 i=k+1,所以有i>k
if(i>k)
printf("%d是素数。\n",m);
else
printf("%d不是素数。\n",m);
return 0;
}
#include <stdio.h>
#include <math.h>
int is_prime(int x) {
for (int i = 2; i <= x / 2; ++i) {
if (x % i == 0) {
return 0;
}
}
return 1;
}
int main() {
for (int i = 2; i <= 100; ++i) {
if (is_prime(i)) {
printf("%d\n", i);
}
}
return 0;
}
1.2、关系运算符
用于比较运算。包括:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!=)共六种。
关系运算符数值列表
运算符 | 名称 | 示例 | 功能 |
---|---|---|---|
> | 大于 | a>b | a大于b时返回真,否则返回假 |
< | 小于 | a<b | a小于b时返回真,否则返回假 |
>= | 大于等于 | a>=b | A大于等于b时返回真,否则返回假 |
<= | 小于等于 | a<=b | A小于等于b时返回真,否则返回假 |
== | 等于 | a==b | a等于b时返回真,否则返回假 |
!= | 不等于 | a!=b | a不等于b时返回真,否则返回假 |
1.3、逻辑运算符
用于逻辑运算。包括:逻辑与(&&)、逻辑或(||)、逻辑非(!)共三种。
=逻辑运算符列表=
运算符 | 名称 | 表达式 | 功能 |
---|---|---|---|
&& | 逻辑与 | x && y | 先判断x,当x为假时结果为假,当x为真时才判断y |
|| | 逻辑或 | x || y | 先判断x,当x为真时结果为真,当x为假时才判断y |
! | 逻辑非 | !x | 将真假颠倒(如果x为真时结果为假,x为假时结果为真) |
--------------------------------&&和||的短路特性--------------------------------
&&运算的短路特性:要使(表达式1)&&(表达式2)运算结果为真则要求:表达式1,表达式2都为真,如果表达式1为假,则不计算表达式2了,因为此时已经确定(表达式1)&&(表达式2)运算结果不可能为真
||运算的短路特性:要使(表达式1)||(表达式2)运算结果为假则要求:表达式1,表达式2都为假,如果表达式1为真,则不计算表达式2了,因为此时已经确定(表达式1)||(表达式2)运算结果不可能为假
#include<stdio.h>
int main(void)
{
int a=0,b=1;
if(a++&&b++)
{
printf("a=%d b=%d\n",a,b);
}
else
{
printf("a=%d b=%d\n",a,b);
//因为&&短路特性,应执行此句,且b++不执行
}
if(a++||--b)
{
printf("a=%d b=%d\n",a,b);
//因为||短路特性,应执行此句,且--b不执行
}
else
{
printf("a=%d b=%d\n",a,b);
}
return 0;
}
1.4、位运算运算符
参与运算的量,按二进制的每个位进行运算。包括:位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)共六种。
按位与运算(&)
按位与运算符"&"是双目运算符。 功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int a = 1, b = 2, c;
c = a & b;
printf("a=%d\nb=%d\nc=%d\n", a, b, c);
}
按位或运算(|)
功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int a = 1, b = 0, c;
c = a || b;
printf("a=%d\nb=%d\nc=%d\n", a, b, c);
}
位异或(^)
功能是相同为0,不同为1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int a = 1, b = 0, c;
c = a ^ b;
printf("a=%d\nb=%d\nc=%d\n", a, b, c);
}
位非(~)
求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int a = 1;
int b = ~a;
printf("a=%d\nb=%d\n",a,b);
}
左移运算符(<<)
左移运算符,是双目运算符。左移n位就是乘以2的n次方。 其功能把,左边的运算数的各二进位全部左移若干位,由,右边的数指定移动的位数,高位丢弃,低位补0。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int a = 1;
int b = a<<2;//a*2^2
printf("a=%d\nb=%d\n",a,b);//a=1;b=4
}
右移运算符(>>)
右移运算符,是双目运算符。右移n位就是除以2的n次方.
其功能是把左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int a = 16;
int b = a>>2;
printf("a=%d\nb=%d\n",a,b);
}
1.5、赋值运算符
用于赋值运算。分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
1.6、条件运算符
条件运算符: ? : 它是唯一的一个三目运算符,用于条件求值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int m= 1;
int n = 2;
int c = (m < n) ?m : n;
printf("c=%d",c);}
1.7、求字节数运算符
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int m= 1;
double n = 2.5;
float s = 52.6f;
printf("m变量所占字节数=%d\n", sizeof(m));
printf("n变量所占字节数=%d\n", sizeof(n));
printf("s变量所占字节数=%d\n", sizeof(s));
}
1.8、指针运算符
指针运算符是一种计算机运算符,在C语言中有两个关于指针的运算符。
&运算符:取地址运算符,&m即是变量m在内存中的实际地址。
*运算符:指针运算符 ,指针解引用操作符,它返回的是指针所指向的对象的值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int* p1, * p2, a, b, c;
scanf_s("%d%d", &a, &b);
p1 = &a;
p2 = &b;
if (*p1 < *p2){
c = *p1;
*p1 = *p2;
*p2 = c;
}
printf("%d,%d\n", a, b);
}
1.9、逗号运算符
逗号运算符,优先级别最低,它将两个及其以上的式子联接起来,从左往右逐个计算表达式,整个表达式的值为最后一个表达式的值。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main(){
int a, b;
b = (a = 1, a + 1, a++);
printf("%d %d\n", a, b);//a=2;b=1;
}
1.10、特殊运算符
主要用于数组、指针和结构体的操作。包括:括号(),下标[],成员访问(->与.)等几种。
2、c语言运算符优先级
说明:
同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符