算数操作符
有 + - * / %
除法中左值和右值都为整形时,取商不要余数,即结果也为整形
整形除法
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;
}
取模
左值
求数在二进制在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为符号位代表负值
负值在存入内存是以补码存入的
原码 反码 补码
正数的 原码 反码 补码相同
负数 原码 反码 补码不同
负值在存入内存是以补码存入的
错误的
正确的
sizeof
为什么
不应该是防止数据精度丢失采用最大内存值吗?
sizeof(s=a+5) 的表达式是不会真实进行运算的
以此类推 判断 循环 里的表达式也一样吗???
按位于 按位或 按位取反的应用
强制转换
练习题
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也为真
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 。
逻辑||
为什么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;
}
函数调用操作符 ()和操作数
()函数调用操作符 接受一个或者多个操作数;第一个操作数是函数名,剩余的操作数就是函数的参数
函数名 也是操作数 实参 也是操作数
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;
}
printf("%s\n", ls.name);
printf("%d\n", ls.age);
printf("%lf\n", ls.weight);
printf("%s\n", ls.id);
隐式类型转换
为什么是-126,不应该是130吗???
整形提升 是按照变量的数据类型的 符号位 来提升的
符号位就是正为0 负为1。
char类型一般但是有符号的char类型 最高位为符号位 补位 时 按 和符号位一样补位
00000011 一个字节char类型
00000000000000000000000000000011 四个字节 int 类型
10000011一个字节char类型
11111111111111111111111110000011 按最高位补位 1为最高位
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;
}