网站建设的风险管理网站做百度推广吗
news/
2025/9/28 22:01:04/
文章来源:
网站建设的风险管理,网站做百度推广吗,成都搭建网站,做电影网站需要注意什么东西操作符的分类 • 算数操作符 #xff1a; 、 - 、 * 、 / 、 % • 移位操作符 #xff1a; 、 • 位操作符 #xff1a; 、 | 、 ^ • 赋值操作符 #xff1a; 、 、 - 、 * 、 / 、 % 、 、 、 、 |…操作符的分类 • 算数操作符 、 - 、 * 、 / 、 % • 移位操作符 、 • 位操作符 、 | 、 ^ • 赋值操作符 、 、 - 、 * 、 / 、 % 、 、 、 、 | 、 ^ • 单目操作符 、 、 -- 、 、 * 、 、 - 、 ~ 、 sizeof 、 ( 类型 ) • 关系操作符 、 、 、 、 、 ! • 逻辑操作符 、 || • 条件操作符 ? : • 逗号表达式 , •下标引用操作符 [] • 函数调用操作符 () • 结构成员访问操作符 . 、 - 进制转换 二进制与十进制 在生活中我们最常用的是十进制十进制满10进1十进制的每一位都是0~9的数字组成其实二进制也同样如此二进制满2进1二进制的每一位都是0~1的数字组成的。10进制的数字从右向左是个位、⼗位、百位....分别每⼀位的权重是 10^0 , 10^1 , 10^2 ...如下 而2进制和10进制是类似的只要把10换成2就行了。 如果你想要在二进制和十进制之间进行转换 十进制转二进制只需要将十进制数依次除二直到余数为0.由下往上依次所得的余数就是10进制转换出的2进制。 二进制转十进制将每一位的值乘上权重值就是十进制数了。 二进制与八进制 8进制的数字每⼀位是0~7的0~7的数字各⾃写成2进制最多有3个2进制位就⾜够了例如7的二进制是111所以在2进制转8进制数的时候从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位剩余不够3个2进制位的直接换算。 二进制与十六进制 16进制的数字每⼀位是0~9,a ~f 的0~9,a ~f的数字各⾃写成2进制最多有4个2进制位就⾜够了例如 f 的⼆进制是1111所以在2进制转16进制数的时候从2进制序列中右边低位开始向左每4个2进制位会换算⼀个16进制位剩余不够4个⼆进制位的直接换算。 原码、反码、补码 整数的2进制表⽰⽅法有三种即原码、反码和补码。有符号整数的三种表⽰⽅法均有符号位和数值位两部分2进制序列中最⾼位的1位是被当做符号位剩余的都是数值位。符号位都是⽤0表⽰“正”⽤1表⽰“负”。 正整数的原、反、补码都相同。 负整数的三种表⽰⽅法各不相同。 原码直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码将原码的符号位不变其他位依次按位取反就可以得到反码。 补码反码1就得到补码。 反码得到原码也是可以使⽤取反1的操作。 对于整形来说数据存放内存中其 实存放的是补码。 原因是 在计算机系统中数值⼀律⽤补码来表⽰和存储。原因在于使⽤补码可以将符号位和数值域统⼀处理同时加法和减法也可以统⼀处理CPU只有加法器此外补码与原码相互转换其运算过程是相同的不需要额外的硬件电路。 移位操作符 包括: 左移操作符和 右移操作符 注意移位操作符的操作数只能是整数。 左移操作符 移位规则左边抛弃右边补0. 如下 #include stdio.h
int main()
{int num 10;int n num1;printf(n %d\n, n);printf(num %d\n, num);return 0;
} 右移操作符 移位规则先右移后分逻辑右移左边用0填充右边丢弃和算数右移左边的原该值的符号位填充右边丢弃大多数情况下都是算数右移。 警告对于移位运算符不要移动负数位这个是标准未定义的。例如 int num 10 ; num -1 ; //error 位操作符、| 、^ 、~ 按位与 有0则0全1才1 | 按位或 有1则1全0才0 ^ 按位异或 相同为0相异为1 ~ 按位取反 注 他们的操作数必须是整数。 因为计算使用的是它们的二进制形式。 下面举几个例子
#include stdio.h
int main()
{int num1 -3;int num2 5;printf(%d\n, num1 num2);printf(%d\n, num1 | num2);printf(%d\n, num1 ^ num2);printf(%d\n, ~0);return 0;
}
#include stdio.h
int main()
{int num1 -3;//10000000000000000000000000000011 -3的原码//11111111111111111111111111111100 -3的反码//11111111111111111111111111111101 -3的补码 int num2 5;//00000000000000000000000000000101 5的原反补码printf(%d\n, num1 num2);//5//11111111111111111111111111111101 -3的补码 //00000000000000000000000000000101 5的原反补码//00000000000000000000000000000101 有0则0全1才1printf(%d\n, num1 | num2);//-3//11111111111111111111111111111101 -3的补码 //00000000000000000000000000000101 5的原反补码//11111111111111111111111111111101 | 有1则1全0才0 补码//10000000000000000000000000000011 原码printf(%d\n, num1 ^ num2);//-8//11111111111111111111111111111101 -3的补码 //00000000000000000000000000000101 5的原反补码//11111111111111111111111111111000 ^ 相同为0相异为1 补码//10000000000000000000000000001000 原码printf(%d\n, ~0);//-1//00000000000000000000000000000000 0的原反补码//11111111111111111111111111111111 ~ 按位取反 补码//10000000000000000000000000000001 原码return 0;
逗号表达式 逗号表达式就是⽤逗号隔开的多个表达式。 如exp1, exp2, exp3, …expN 逗号表达式从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。 int a 1;
int b 2;
int c (ab, ab10, a, ba1);//逗号表达式
c是多少 答案是13从左向右依次计算a b 10 12, b a 1 13. if (a b 1, ca / 2, d 0) 这同样是逗号表达式前两步也可以提出来放在if语句的上面。 a get_val();
count_val(a);
while (a 0)
{//业务处理a get_val();count_val(a);
}//如果使⽤逗号表达式改写
while (a get_val(), count_val(a), a0)
{//业务处理
} 这就是逗号表达式的几种方式。 下标访问[]、函数调⽤() 1、下标引用操作符 操作数一个数组名 一个索引值 int arr[ 10 ]; // 创建数组 arr[ 9 ] 10 ; // 实⽤下标引⽤操作符。 [ ] 的两个操作数是 arr 和 9 。 2、函数调用操作符 接收一个或者多个操作符第⼀个操作数是函数名剩余的操作数就是传递给函数的参数。
#include stdio.h
void test1()
{printf(hehe\n);
}
void test2(const char *str)
{printf(%s\n, str);
}
int main()
{test1(); //这⾥的()就是作为函数调⽤操作符。test2(hello bit.);//这⾥的()就是函数调⽤操作符。return 0;
}
结构成员访问操作符
1、结构体 结构是⼀些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量如 标量、数组、指针甚⾄是其他结构体。 C语⾔已经提供了内置类型如char、short、int、long、float、double等但是只有这些内置类 型还是不够的假设我想描述学⽣描述⼀本书这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体重等描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问题增加了结构体这种⾃定义的数据类型让程序员可以⾃⼰创造适合的类型。
结构的声明 struct tag { member- list ; }variable- list ; 描述⼀个学⽣ struct Stu { char name[ 20 ]; // 名字 int age; // 年龄 char sex[ 5 ]; // 性别 char id[ 20 ]; // 学号 }; // 分号不能丢 结构体变量的定义和初始化
//代码1变量的定义
struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1struct Point p2; //定义结构体变量p2//代码2:初始化。
struct Point p3 {10, 20};struct Stu //类型声明
{char name[15];//名字int age; //年龄
};struct Stu s1 {zhangsan, 20};//初始化
struct Stu s2 {.age20, .namelisi};//指定顺序初始化//代码3
struct Node
{int data;struct Point p;struct Node* next;
}n1 {10, {4,5}, NULL}; //结构体嵌套初始化struct Node n2 {20, {5, 6}, NULL};//结构体嵌套初始化
2、结构成员访问操作符
结构体成员的直接访问 结构体成员的直接访问是通过点操作符.访问的。点操作符接受两个操作数。 即结构体变量.成员名 如下 #include stdio.h
struct Point
{int x;int y;
}p {1,2};
int main()
{printf(x: %d y: %d\n, p.x, p.y);return 0;
} 结构体成员的间接访问 有时候我们得到的不是⼀个结构体变量⽽是得到了⼀个指向结构体的指针。 即 结构体指针-成员名 如下所⽰ #include stdio.h
struct Point
{int x;int y;
};
int main()
{struct Point p {3, 4};struct Point *ptr p;ptr-x 10;ptr-y 20;printf(x %d y %d\n, ptr-x, ptr-y);return 0;
} 操作符的优先级与结合性 两个属性决定了表达式求值的计算顺序 优先级 优先级指的是如果⼀个表达式包含多个运算符哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的。这里之前讲过不过多阐述。 结合性 如果两个运算符的优先级相同那就要看结合性了大部分的运算符是从左向右结合少数运算符从右向左执行如赋值运算符。 结合性参考https://zh.cppreference.com/w/c/language/operator_precedence 表达式求值 整型提升 C语⾔中整型算术运算总是⾄少以缺省整型类型的精度来进⾏的。 为了获得这个精度表达式中的字符和短整型操作数在使⽤之前被转换为普通整型这种转换称为整 型提升。 整型提升的意义 表达式的整型运算要在CPU的相应运算器件内执⾏CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度同时也是CPU的通⽤寄存器的⻓度。 因此即使两个char类型的相加在CPU执⾏时实际上也要先转换为CPU内整型操作数的标准⻓度。 通⽤CPUgeneral-purpose CPU是难以直接实现两个8⽐特字节直接相加运算虽然机器指令中可能有这种字节相加指令。所以表达式中各种⻓度可能⼩于int⻓度的整型值都必须先转换为int或unsigned int然后才能送⼊CPU去执⾏运算 char a,b,c;
...
a b c; 这里 b 和 c 的值首先被提升为普通整型然后再执⾏加法运算加法运算完成之后结果将被截断然后再存储于a中。 如何进⾏整体提升呢 1. 有符号整数提升是按照变量的数据类型的符号位来提升的 2. ⽆符号整数提升⾼位补0 // 负数的整形提升 char c1 -1 ; 变量 c1 的⼆进制位 ( 补码 ) 中只有 8 个⽐特位 1111111 因为 char 为有符号的 char 所以整形提升的时候⾼位补充符号位即为 1 提升之后的结果是 11111111111111111111111111111111 // 正数的整形提升 char c2 1 ; 变量 c2 的⼆进制位 ( 补码 ) 中只有 8 个⽐特位 00000001 因为 char 为有符号的 char 所以整形提升的时候⾼位补充符号位即为 0 提升之后的结果是 00000000000000000000000000000001 // ⽆符号整形提升⾼位补 0 算术转换 如果某个操作符的各个操作数属于不同的类型那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型否则操作就⽆法进⾏。下⾯的层次体系称为寻常算术转换。 long double double float unsigned long int long int unsigned int int 如果某个操作数的类型在上⾯这个列表中排名靠后那么⾸先要转换为另外⼀个操作数的类型后执⾏运算。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921177.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!