C语言_干翻操作符_含义+结合性+优先级+例子分析(上)
操作符知识比较杂乱,这里我按照优先级从高向低的顺序进行整理,优先度越高运算中约先进行
由于本人能力有限,有一些遗漏或者错误还希望大家斧正
文章目录
优先度最高((),[ ],->,.)
优先级2级(!,~,++,- -,-(负号),*(指针),&(取地址),sizeof)
优先级3级(*(乘法),/,%)
优先度最高((),[ ],->,.)
1,( )操作符
含义:函数调用操作符。
操作数是函数名以及函数内部的传参数。
eg: test()操作数是函数名test。
test(x,y)操作数是test ,x,y(函数名+内部的传参数)
注意函数调用操作符只要是函数就必须有
eg: sizeof()的括号可以省略,说明sizeof不是函数,是一种操作符。
强制类型转化
(强制转化类型)
#include <stdio.h>
int main()
{
int a =(int)3.14 ;
printf("a=%d ",a);
return 0;
}
结合性(同优先级操作符在语句中的“运算优先级(或叫顺序) 从左向右。
2,[ ]操作符
含义:下标运算操作符
eg:
arr[4] 操作数为arr和4。
结合性:从左向右
3,->操作符
含义:指向结构体成员操作符。
eg:
#include<stdio.h>
struct student
{
//结构体的成员
char name[20];
int age;
char sex[5];
};
int main()
{
//结构体访问操作符是建立在结构体上的
struct student s = { "小红",18,"woman" };//初始化结构体
struct student* ps = &s;
/*printf("%s",(*ps).name);*/
printf("%s",ps->name);
return 0;
}
作用:通过指针找到结构体变量中的成员。
结合性:从左向右。
4, . 操作符
含义:结构体成员运算符。
eg:
#include<stdio.h>
struct student
{
//结构体的成员
char name[20];
int age;
char sex[5];
};
int main()
{
//结构体访问操作符是建立在结构体上的
struct student s = { "小红",18,"woman" };//初始化结构体
printf("%s",s.name);
return 0;
}
#include<stdio.h>
struct student
{
//结构体的成员
char name[20];
int age;
char sex[5];
};
int main()
{
//结构体访问操作符是建立在结构体上的
struct student s = { "小红",18,"woman" };//初始化结构体
struct student* ps = &s;
printf("%s",(*ps).name);
return 0;
}
用来找到结构体变量中的成员。
结合性:从左到右
优先级2级(!,~,++,- -,-(负号),*(指针),&(取地址),sizeof)
1,!操作符
含义:逻辑非运算(单目运算符)
由真到假,由假到真(0为假,非0为真默认为1)
#include<stdio.h>
int main()
{
int a = 0;
int b = 6;
printf("a=%d b=%d",!a,!b);
return 0;
}
数据的多组输入
#include <stdio.h>
int main()
{
int x = 0;
while (scanf("%d", &x) != EOF)
{
if (x >= 140)
printf("Genius\n");
else
printf("Not Genius\n");
}
return 0;
}
(文件读取到最后返回一个EOF,EOF本质是-1为真,!EOF为0,程序就会停下来来实现多组输入)
在判断语句中使用
#include <stdio.h>
int main()
{
int input = 0;
if (!input)//如果input为假执行
{
//....
}
if (input)//如果input为真执行
{
//....
}
return 0;
}
结合性:从右向左
2, ~操作符
含义:按位取反运算符(单目操作符)
(按二进制位取反)
方法:
真变假,假变真。
在二进制位中0变1,1变0;
-----------------------------------------------------------------
首先我们要知道
整数在计算机中存的是它的补码
原码——>反码——>补码
三者的运算规则为
原码按位取反(符号位不变)——>反码。
反码+1——>补码。
在32位计算机中首位是符号位
表示正负不表示大小。
首位为1表示负数,首位为0表示正数。
eg(都是32位)
10000000000000000000000000000001表示-1
00000000000000000000000000000001表示1
对于正整数规定,它的原码,反码,补码都相同可以直接用。
对于负数计算机存的补码不等,要转成原码才可以直到其大小。
eg:
1 1 1 1 1…1 1(32位)(符号位1说明是负数)补码
1 1 1 1 1…1 0(32位)(补码-1到反码)
1 0 0 0 0…0 1(32位)(符号位不变其余位按位取反到原码)
原码首位为1说明是负数,发现值数字-1。
-----------------------------------------------------------------
所以-1在计算机中储存的是32个1
-1取反为32个0是0
而文件读取失败返回EOF本质是-1
0在计算机会判断为假
所以连续输入还可以写为
int main()
{
int x = 0;
while (~scanf("%d", &x) )
{
if (x >= 140)
printf("Genius\n");
else
printf("Not Genius\n");
}
return 0;
}
3,++操作符
含义:自增运算符(单目操作符)
分为前置++和后置++(他们运算顺序不同)
前置++
先++再在使用。
#include <stdio.h>
int main()
{
int a = 10;
int b = ++a;
printf("a=%d b=%d",a,b);
return 0;
}
#include <stdio.h>
int main()
{
int a = 10;
printf("a=%d ",++a);
return 0;
}
#include <stdio.h>
int main()
{
int a = 10;
printf("a=%d ",++a);
return 0;
}
后置++
先使用再++
#include <stdio.h>
int main()
{
int a = 10;
int b = a++;
printf("a=%d b=%d",a,b);
return 0;
}
#include <stdio.h>
int main()
{
int a = 10;
printf("a=%d ",a++);
return 0;
}
这里因为是先使用所以a没有自增就被打印了出来。
结合性从右向左
4,- -操作符
含义:自减运算符(单目运算符)
分为前置- -和后置- -
前置- -
先- -再使用
#include <stdio.h>
int main()
{
int a = 10;
int b = --a;
printf("a=%d b=%d",a,b);
return 0;
}
#include <stdio.h>
int main()
{
int a = 10;
printf("a=%d ",--a);
return 0;
}
后置- -
先使用再- -
#include <stdio.h>
int main()
{
int a = 10;
int b = a--;
printf("a=%d b=%d",a,b);
return 0;
}
#include <stdio.h>
int main()
{
int a = 10;
printf("a=%d ",a--);
return 0;
}
这里因为先使用所以a还没有自减就已经被打印
5,-符号运算符
含义:负号运算符(单目运算符)
优先级:从右向左
(注意负号运算符和减法运算符不同,负号运算符是单目运算符,减法运算符是双目运算符,系统会自动识别)
#include <stdio.h>
int main()
{
int a = 10;
a = -a;//负号运算符
a = a - 10;//减法运算符
return 0;
}
6,* (指针)操作符
含义:指针运算符(单目运算符)
用来存放地址,或者找到指针变量所指对象。
(具体指针性质在之后提到)
#include <stdio.h>
int main()
{
int a = 5;
int* pr = &a;//存放地址
printf("%d",*pr);//找到指针变量所指对象
return 0;
}
结合性:从右向左
7,&(取地址)操作符
含义:地址运算符(单目操作符)
结合性:自右向左
通常伴随指针使用不再赘述
8,sizeof 操作符
含义:长度运算符(单目操作符)
sizeof可以计算变量大小,也可以计算变量类型大小
(注意int[10]是数组的类型)
当求变量大小时sizeof()括号可以省略
但当求到变量类型的大小时括号不可以省略
sizeof与strlen的区别
sizeof是操作符求大小,strlen是求字符串长度函数其必须有()函数调用操作符
sizeof会计算\0的大小,而strlen不会计算\0的长度(\0)是字符串结束的标志。
sizeof括号内的表达式是不会执行计算的
eg:
#include <stdio.h>
int main()
{
int s = 20;
int a = 10;
printf("%d\n",sizeof(s=a+5));
printf("%d",s);
return 0;
}
发现s在sizeof()内却没有计算,sizeof只计算了s类型的大小
(注意这个例子中决定sizeof值的是s的类型不是表达式中a的类型)
不计算的原因是
我们编译的.c文件会经过链接生成.exe可执行文件
而sizeof(s=a+5)在编译过程中就被替换成s类型的大小,所以就相当于s=a+5这个表达式在exe文件中是2,所以不会i执行运算
结合性:从右向左
优先级3级(*(乘法),/,%)
1.*(乘法),/,%操作符
*(乘法)操作符 运算不在赘述;
/(除法)操作符
(注意要想通过除法得到一个浮点型,除数与被除数至少有一个要写出小数)
#include <stdio.h>
int main()
{
float i = 3 / 2.0;
printf("%f",i);
return 0;
}
%(求余操作符)
(注意%不能有小数)
通常通过%来控制随机数的范围,
或者得到数字的每一位,
也可以通过%2来得到数字二进制的每一位。
三者结合性:从左向右。