1.在进行除法运算的时候,如果两个操作数都是整数,那么结果就是整数。要想得到的结果是浮点数,至少有一个操作数是浮点数,最后的结果也是定义为浮点类型。
2.在进行取模运算的时候,两个操作数都必须是整数,不能是小数。
3.右移分为算术右移和逻辑右移:
- 算术右移
右边丢弃,左边补原符号位
- 逻辑右移
右边丢弃,左边补0
左移操作符:左边丢弃,右边补0
在我们C语言编程环境中,一般使用的都是算术右移
整数在内存的存储都是以补码的形式存储的,正整数的源码,反码,补码三者相同。
4.不能创建临时变量,交换两个数
- 加减法(因为a,b都是整型,所以存储范围都是有限的,当a,b的值过大的时候,就有可能会产生溢出)
#define _CRT_SRCURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a=3;
int b=5;
a=a+b;
b=a-b;
a=a-b;
printf("a=%d\nb=%d\n",a,b);
return 0;
}
- 异或的方法
#define _CRT_SRCURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a=3;
int b=5;
a=a^b;
b=a^b;
a=a^b;
printf("a=%d\nb=%d\n",a,b);
return 0;
}
5.求一个整数存储在内存中二进制中1的个数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 0;
int i = 0;
int count = 0;
printf("请输入一个数:>");
scanf("%d", &a);
for (i = 0; i < 32; i++)
{
if ((a>>i & 1) == 1)
{
count++;
}
}
printf("%d\n", count);
return 0;
}
6.sizeof 运算符只负责计算空间大小,即使里面进行了运算,但是不会真的改变其大小
7.逻辑与有一个特点就是,从左向右与的时候,一旦左边出现假,即结果为0,那么右边的操作便不再进行。
逻辑或的特点是一旦最左边为真,即为1,那么右边的操作便不再进行
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i= 0,a=0,b=2,c=3,d=4;
i = a++ && ++b && d++;
printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
return 0;
}
结果为1 2 3 4
8.三目操作符
exp1? exp2:exp3;如果表达式1为真,就执行表达式2,为假就执行表达式3
9.逗号表达式
exp1,exp2,exp3,exp4,exp5……
逗号表达式,就是用逗号隔开的多个表达式,逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
10.访问一个结构的成员
- 结构体.成员名
- 结构体指针->成员名
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
struct Student
{
char name[10];
int age;
char sex[5];
double score;
};//定义一个结构体
void set_age1(struct Student stu)
{
stu.name = 18;
}
void set_age2(struct Student* pStu)
{
pStu->age = 18;
}
int main()
{
struct Student stu;//在这里,struct Student就类似于int,是一种类型,被称为结构体类型
struct Student* pstu = &stu;//定义一个结构体指针,因为stu是结构体变量,所以存储其地址的指针类型叫做结构体指针
stu.age = 20;//结构体成员访问
set_age1(stu);
pstu->age = 20;//结构体成员访问
set_age2(pstu);
return 0;
}
11.隐式类型转换
- 整形提升是按照变量的数据类型的符号位来提升的。即如果符号位为1,那么前面就补1,如果符号位为0,那么前面就补0。凡是对操作数进行运行算的,都会进行整型提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算去件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU是难以直接实现两个8比特字节直接相加运算(虽然及其指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行。
- 算术类型转换
long double
double
float
unsigned long int
long int
unsigned int
int
从下到上类型等级依次提高,如果不同等级同时出现,要转换成等级较高的类型。
12.操作符的属性
复杂表达式的求值有三个影响因素:
1.操作符的优先级
2.操作符的结合性
3.是否控制求值顺序
两个相邻的操作符先执行哪个?取决于他们的优先级,如果两者的优先级相同,再取决于操作符的结合性
标签:int,C语言,stu,操作符,include,CPU,表达式 From: https://blog.51cto.com/u_15760583/5733985