算数操作符

  +   -   *   /    % 

除法中左值和右值都为整形时,取商不要余数,即结果也为整形

整形除法

int main()
{

int i = 5 / 2;
printf("i= %d\n", i);

return 0;
}

浮点型的除法

左值或右值为浮点型,即可是表达式变成浮点型,所以接收也要使用浮点型

int main()
{
double i = 5 / 2.0;
printf("i= %lf\n", i);

return 0;
}

操作符_操作数

取模

左值

操作符_操作数_02

求数在二进制在1的个数

int main()
{
printf("请输入一个数:> ");
int i = 0;
int count = 0;//计数
int num = 0;
scanf("%d", &num);
//求用户输入的数在二进制中有多少个1
//取模得余数,余数的范围为0--阶码减一。 取商得阶码的倍数,得到新数继续开始重复
while (num)//限制不可为0
{

i = num % 2;
if (i == 1)
{
count++;
}
num = num / 2;

}
printf("count = %d",count );
return 0;
}

-1的二进制是 1111111111111111111111111111111111111111 首元素1为符号位代表负值

负值在存入内存是以补码存入的

原码 反码  补码 

正数的 原码 反码  补码相同

负数 原码 反码  补码不同

负值在存入内存是以补码存入的

错误的 

操作符_补码_03

正确的 

操作符_操作数_04


sizeof

为什么 

不应该是防止数据精度丢失采用最大内存值吗?

sizeof(s=a+5) 的表达式是不会真实进行运算的

以此类推 判断 循环 里的表达式也一样吗???

操作符_操作数_05


操作符_操作符_06



操作符_补码_07

按位于  按位或  按位取反的应用

操作符_操作符_08

强制转换

操作符_操作数_09

练习题

void test2(char ch[])
{
printf("%d\n", sizeof(ch));//指针类型

}
void test1(int arr[])
{
printf("%d\n", sizeof(arr));
//arr为首元素地址,所以接收形式为指针类型 X64 8个字节
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));//代表数组名 int类型为4个字节
printf("%d\n", sizeof(ch));//char类型为1个字节
test1(arr);
test2(ch);

return 0;
}

逻辑&&

A为真 B为真A&&B也为真

操作符_操作数_10


操作符_操作符_11


int main()
{
int i = 0;
int a = 0;
int b = 2;
int c = 3;
int d = 4;
i = a++ && ++b && d++;
printf("a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);


return 0;
}

a++  先使用a在自增1

 a先使用a为0   为假    &&后面不需要计算都为假

然后a自增为 1 ,结果就是1 2 3 4 。


操作符_操作数_12

逻辑||


为什么d=4???不应该为5吗 d++ 先使用在自增吗????


int main()
{
int i = 0;
int a = 0;
int b = 2;
int c = 3;
int d = 4;
//i = a++ && ++b && d++;
i = a++ || ++b || d++;
printf("a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);


return 0;
}

操作符_操作数_13


函数调用操作符 ()和操作数

()函数调用操作符 接受一个或者多个操作数;第一个操作数是函数名,剩余的操作数就是函数的参数

函数名 也是操作数  实参 也是操作数

int get_max(int x, int y)
{
return x > y ? x : y;//三目操作符
}

int main()
{
int a = 10;
int b = 20;
//调用函数的时候()就是函数调用的操作符
int max = get_max(a, b);//比较大小 返回最大值
printf("max = %d\n", max);
return 0;
}

【】下标引用操作符

arr[ 10 ]    操作数: 一个数名+一个索引值

结构体

结构体变量 . 结构体的成员的变量     . 操作符用来访问结构体成员的变量

结构体指针->成员名 

*结构体变量的指针变量 . 结构体的成员的变量

结构体常变量的指针变量 -> 结构体的成员的变量

如何描述一个对象,或相同类型的模块


//一个抽象出来的类型 例如学生

struct stu//结构体类型不占用内存空间 相当于图纸 而不是实体
{
//结构体成员
char name[20];
int age;
double weight;
char id[20];

};//分号很重要 说明这是一个语句

int main()
{
//如何使用结构体 结构体为一种类型,c语言中类型是用来创建变量的
struct stu ls = { "凌松",32,120.5,"321324" };
//使用 struct stu 结构体类型创建了一个 结构体类型的变量 ls 并初始化{}
struct stu* p = &ls;

printf("%s\n",(*p).name );
printf("%d\n", (*p).age);
printf("%lf\n", (*p).weight);
printf("%s\n", (*p).id);

printf("\n%s\n", p -> name);
printf("%d\n", p -> age);
printf("%lf\n", p -> weight);
printf("%s\n", p -> id);

return 0;
}


操作符_补码_14

printf("%s\n", ls.name);
printf("%d\n", ls.age);
printf("%lf\n", ls.weight);
printf("%s\n", ls.id);

操作符_补码_15

隐式类型转换

为什么是-126,不应该是130吗???

整形提升 是按照变量的数据类型的 符号位 来提升的

符号位就是正为0  负为1。

char类型一般但是有符号的char类型 最高位为符号位 补位 时 按 和符号位一样补位

00000011 一个字节char类型

00000000000000000000000000000011 四个字节 int 类型

10000011一个字节char类型

11111111111111111111111110000011   按最高位补位 1为最高位

操作符_操作符_16

int main()
{
char a = 3;
//00000000000000000000000000000011 3的二进制数 内存存放方式

// 发生截断 00000011---a
//因为是字符类型只能存放1个字节 所以只能存放8个bit
//
//000000000000000000000000
//01111111---b
char b = 127;
char c = a + b;
//如何相加??? 要发生 整形提升 整形提升的规则
//00000011---a
// char 类型最高位0为符号位
// 000000000000000000000000000011
//01111111---b
//0000000000000000000000001111111
//0000000000000000000000010000010 加完之后的结果
//c 为char类型 需要截断 得
//100000010--c 因为打印的为整形 所以需要整形提升
//11111111111111111111111100000010 补码 减一得到反码
//11111111111111111111111100000001 反码
//10000000000000000000000011111110 原码

printf("%d\n", c);


return 0;
}