当前位置: 首页 > news >正文

贵州省城乡建设局网站查WordPress情侣网站

贵州省城乡建设局网站查,WordPress情侣网站,自己做网站 为什么出现403,河南省建设厅专家库目录一、前言二、操作符分类三、算术操作符四、移位操作符1、左移操作符2、右移操作符五、位操作符拓展1、不能创建临时变量#xff08;第三个变量#xff09;#xff0c;实现两个数的交换。2、编写代码实现#xff1a;求一个整数存储在内存中的二进制中1的个数。六、赋值操… 目录一、前言二、操作符分类三、算术操作符四、移位操作符1、左移操作符2、右移操作符五、位操作符拓展1、不能创建临时变量第三个变量实现两个数的交换。2、编写代码实现求一个整数存储在内存中的二进制中1的个数。六、赋值操作符七、单目操作符1、简介1、2、和*3、sizeof2、sizeof和数组3、 和- -运算符4、~5、八、关系操作符九、 逻辑操作符十、条件操作符十一、逗号表达式十二、下标引用、函数调用和结构成员1、下标引用操作符 [ ]2、函数调用操作符3、访问一个结构的成员十三、表达式求值1、隐式类型转换1、整型提升的意义2、如何进行整体提升呢2、算术转换3、操作符的属性一些问题表达式表达式1表达式2表达式3表达式4表达式5一、前言 本人是一名小白这一篇是记录我C语言学习中的操作符的所学所得仅为简单的认识下C语言中的各个知识。 二、操作符分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 三、算术操作符 - * / % 除了 % 操作符只作用于整数之外其他的几个操作符可以作用于整数和浮点数。对于 / 操作符如果两个操作数都为整数执行整数除法结果为商。而只要有浮点数执行的就是浮点数除法从而得到小数的结果。 #include stdio.hint main() {int a 5;int b 2;double c 2.0;//只得到整数结果商printf(%d\n, a / b);//除法想得到小数的结果必须保证除数和被除数至少有一个是浮点数printf(%.1f\n, a / c);//2.5return 0; }运行结果 4. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。 四、移位操作符 左移操作符 右移操作符 注移位操作符的操作数只能是整数。 移动的是二进制位二进制位的表示进制详解见博客进制详解整数在c语言中可以存放到int类型的变量中int类型是4个字节32bit在内存中存储的是整数的二进制的补码移位操作符移动的是存储在内存中的补码 1、左移操作符 左边丢弃、右边补0扩大二倍举例 正整数 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a 4;//0000 0000 0000 0000 0000 0000 0000 0100a的补码int b a 1;//把a向左移动一位赋给b但a不发生变化//右边添0左边抛弃//0000 0000 0000 0000 0000 0000 0000 1000b的补码printf(a%d b%d\n, a, b);return 0; }运算结果 负整数 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a -4;//1111 1111 1111 1111 1111 1111 1111 1100a的补码int b a 1;//把a向左移动一位赋给b但a不发生变化//右边添0左边抛弃//1111 1111 1111 1111 1111 1111 1111 1000b的补码,-8printf(a%d b%d\n, a, b);return 0; }运算结果 2、右移操作符 首先右移运算分两种 逻辑移位 左边用0填充右边丢弃算术移位 左边用原该值的符号位填充右边丢弃 注意是哪种移动方式编译器并没有明确规定取决于编译器。但大部分是算数移位。举例 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a -4;//1111 1111 1111 1111 1111 1111 1111 1100a的补码int b a 1;//把a向右移动一位赋给b但a不发生变化//左边用原该值的符号位填充右边丢弃//1111 1111 1111 1111 1111 1111 1111 1110b的补码,-2printf(a%d b%d\n, a, b);return 0; }运行结果 警告⚠ 对于移位运算符不要移动负数位这个是标准未定义的。 int num 10; num-1;//error五、位操作符 位操作符有 //按位与 | //按位或 ^ //按位异或 注他们的操作数必须是整数。 按照二进制位详见博客位操作符 举例 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a 3;//a的原码反码补码相同//0000 0000 0000 0000 0000 0000 0000 0011int b -5;//b的原码 1000 0000 0000 0000 0000 0000 0000 0101//b的反码 1111 1111 1111 1111 1111 1111 1111 1010//b的补码 1111 1111 1111 1111 1111 1111 1111 1011int c a b;//0000 0000 0000 0000 0000 0000 0000 0011//1111 1111 1111 1111 1111 1111 1111 1011//0000 0000 0000 0000 0000 0000 0000 0011 c的补码3int d a | b;//0000 0000 0000 0000 0000 0000 0000 0011//1111 1111 1111 1111 1111 1111 1111 1011//1111 1111 1111 1111 1111 1111 1111 1011 d的补码-5int e a ^ b;//0000 0000 0000 0000 0000 0000 0000 0011//1111 1111 1111 1111 1111 1111 1111 1011//1111 1111 1111 1111 1111 1111 1111 1000 e的补码-8printf(c%d d%d e%d\n, c, d, e);return 0; }运算结果 拓展 X^Y^Y X0^X XX ^ X 0异或支持交换律 举例 1、不能创建临时变量第三个变量实现两个数的交换。 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h//数学方法 void ex_suanshu(int a, int b) {a a b;b a - b;//ab-baa a - b;//ab-abprintf(a%d b%d\n, a, b); }//异或法 void ex_yihuo(int a, int b) {a a ^ b;b a ^ b;//a^b^baa a ^ b;//a^b^abprintf(a%d b%d\n, a, b); }int main() {int a 3;int b 5;ex_suanshu(a, b);//可能会溢出ab的和可能超出int范围ex_yihuo(a, b);return 0; }运算结果 2、编写代码实现求一个整数存储在内存中的二进制中1的个数。 此处只给出一个常规方法 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int i 5;//i的补码 0000 0000 0000 0000 0000 0000 0000 0101int m 1;//m的补码 0000 0000 0000 0000 0000 0000 0000 0001int j 0;int count 0;for (j 0; j 32; j){if ((m i j) 1){count;}}printf(%d\n, count);return 0; }运行结果 六、赋值操作符 赋值操作符是一个很棒的操作符他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋 值。 赋值操作符可以连续使用比如 int a 10; int x 0; int y 20; a x y1;//连续赋值,y1先赋给xx在赋给a不利于调试 这样的代码感觉怎么样 那同样的语义你看看 x y1; a x; 这样的写法是不是更加清晰爽朗而且易于调试。 复合赋值符 - * / % | ^ int x 10; x x10; x 10;//复合赋值 //其他运算符一样的道理。这样写更加简洁。七、单目操作符 只针对一个对象 1、简介 ! 逻辑反操作 - 负值 正值 取地址 sizeof 操作数的类型长度以字节为单位 ~ 对一个数的二进制按位取反 – 前置、后置– 前置、后置 * 间接访问操作符(解引用操作符) (类型) 强制类型转换 1、 #define _CRT_SECURE_NO_WARNINGS 1 # include stdio.hint main() {//“!”介绍当某个条件为假我还想执行就可以用//举例int flag 0;if (!(flag ! 0)){printf(呵呵\n);}return 0; }运行结果 2、和* 一个字节对应一个地址 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a 10;//占用四个字节printf(%d\n, sizeof(a));//打印a所占空间单位是字节char b 0;//占用一个字节printf(%d\n, sizeof(b));//打印b所占空间printf(%p\n, a);//打印a的地址printf(%p\n, b);//打印c的地址int* pa a;//a就是取a的地址pa是指针变量*告诉我们pa是指针变量int是告诉我们pa指向的a是int类型*pa 20;//* - 是解引用操作符此时*pa就是aprintf(%d\n, a);//看a是否改变int arr[10] { 0 };arr;//取数组的地址//野指针 - 问题程序会崩*(int*)0x00001123 100;return 0; }运行结果 3、sizeof 关于sizeof其实我们之前已经见过了可以求变量类型所占空间的大小。单位字节 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a 0;int* pa;int arr[10] { 0 };//sizeof()的格式化输出用%zu只是识别所言计算变量的类型并不访问因此数组越界也并不会程序崩溃printf(%zu\n, sizeof(a));printf(%zu\n, sizeof(pa));printf(%zu\n, sizeof(arr));printf(%zu\n, sizeof(arr[10]));printf(%zu\n, sizeof a);//当sizeof后面是变量时可以省略但类型的话则不行从而也证明其是操作符而不是函数//printf(%zu\n, sizeof int);//这种写法是错误的return 0; }运行结果 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {short s 2;int a 4;printf(%zu\n, sizeof(s a 5));//2//首先对于式子s a 5s是short类型而a5是int类型是要进行截断去掉两个字节的//sizeof表达式中表达式是不会进行计算的只是推理出类型//表达式不会计算的原因我们写代码执行程序时是要从test.c源文件-编译-链接-test.exe而sizeof在编译期间就执行完了运行代码时候自然便没有它printf(%d\n, s);//2//下面介绍一下截断s a 5;//a 0000 0000 0000 0000 0000 0000 0000 0100//5 0000 0000 0000 0000 0000 0000 0000 0101//a5 0000 0000 0000 0000 0000 0000 0000 1001 9//截断取a5的后两个字节 0000 0000 0000 1001 并将其放到s里面去//s 0000 0000 0000 1001printf(%d\n, s);return 0; }2、sizeof和数组 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hvoid test1(int arr[]) {printf(%d\n, sizeof(arr));//(2)4 }void test2(char ch[]) {printf(%d\n, sizeof(ch));//(4)4 }int main() {int arr[10] { 0 };char ch[10] { 0 };printf(%d\n, sizeof(arr));//(1)40printf(%d\n, sizeof(ch));//(3)10test1(arr);test2(ch);return 0; }运行结果 详见博客C语言学习之路–获取函数参数的数组的元素个数 3、 和- -运算符 前置先增/减再使用后置先使用再增/减 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a 10;int x a;//先对a进行自增然后对使用a也就是表达式的值是a自增之后的值。x为11。int y --a;//先对a进行自减然后对使用a也就是表达式的值是a自减之后的值。y为10;int b 10;int z b;//先对b先使用再增加这样z的值是10之后b变成11int w b--;//先对b先使用再自减这样w的值是11之后b变成10return 0; }4、~ 二进制按位取反符号位也进行操作详见博客非运算 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a 10;int n 0;scanf(%d, n);//把a的第n位置为1a a | (1 (n-1));printf(a%d\n, a);//把a的第n位置为0a a ~(1 (n - 1));printf(a%d\n, a);//00000000000000000000000000001010//00000000000000000000000000010000//12;//00000000000000000000000000011010//11111111111111111111111111101111//00000000000000000000000000010000//00000000000000000000000000001010return 0; }5、 强制类型转换 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a (int)3.14;//只保留整数部分printf(%d\n, a);return 0; }运算结果 八、关系操作符 ! 用于测试“不相等” 用于测试“相等” 注意在编程的过程中 和不小心写错导致的错误。 并不是所有对象都能这样比比如说数组字符串结构体不能比较两个字符串的内容实际上比的是2个字符串的首字符的地址 九、 逻辑操作符 逻辑操作符有哪些 逻辑与 || 逻辑或 区分逻辑与和按位与区分逻辑或和按位或 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() {int i 0, a 0, b 2, c 3, d 4;i a b d;//这里涉及到一个断路问题对于当判断到一个表达式会执行为假时后续的便不再执行同理对于||当判断到一个表达式为真会执行时后续的便不再执行//i a||b||d;printf(a %d\nb %d\nc %d\nd %d\n, a, b, c, d);printf(%d\n, i);//与||判断为真时i为1否则为0return 0; }运行结果 十、条件操作符 也称为三目操作符有三个操作数 exp1 ? exp2 : exp3 当exp1为真exp2执行为整个表达式的结果exp3不执行 当exp1为假exp3执行为整个表达式的结果exp2不执行 举例 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a 3;int b 2;if (a 5){b 3;}else{b 0;}b (a 5 ? 3 : 0);//与else语句逻辑一样//求两个数最大值int m (a b ? a : b);return 0; }十一、逗号表达式 exp1,exp2,…,expn 逗号表达式就是用逗号隔开的多个表达式。逗号表达式从左向右依次执行。整个表达式的结果是最后一个表达式的结果。 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {int a 1;int b 2;int c (a b, a b 10, a, b a 1);//逗号表达式//从左向右依次执行//首先ab为假这个式子便是0//a b 10a为12//a//b a 1b13//最后赋值给cprintf(%d\n, c);//13int d 1;if (a b 1, c a / 2, d 0)//从左向右依次计算最后判断d0{}a get_val();count_val(a);while (a 0){ //业务处理a get_val();count_val(a);}//如果使用逗号表达式改写while (a get_val(), count_val(a), a 0)//从左向右依次执行最后判断a0{//业务处理}return 0; }十二、下标引用、函数调用和结构成员 1、下标引用操作符 [ ] 不是定义数组的[ ]操作数一个数组名 一个索引值 int arr[10];//创建数组arr[9] 10;//实用下标引用操作符。 // [ ]的两个操作数是arr和9。2、函数调用操作符 接受一个或者多个操作数第一个操作数是函数名剩余的操作数就是传递给函数的参数。 #include stdio.hvoid test1(){printf(hehe\n);}void test2(const char *str){printf(%s\n, str);}int main(){test1(); //实用作为函数调用操作符。test2(hello bit.);//实用作为函数调用操作符。return 0;}3、访问一个结构的成员 . 结构体.成员名 - 结构体指针-成员名 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h//书书名价格struct Book {char name[10];int price;};int main() {struct Book sb { 一,55 };printf(%d\n, sb.price);//结构体变量.结构体成员名struct Book* ps sb;printf(%d\n, (*ps).price);///*ps必须加括号因为.的优先级高于* printf(%d\n, ps-price);//结构体指针-结构体成员名return 0; }十三、表达式求值 表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样有些表达式的操作数在求值的过程中可能需要转换为其他类型。 1、隐式类型转换 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度表达式中的字符和短整型操作数在使用之前被转换为普通整型int这种转换称为整型提升。 举例 //实例1 char a,b,c; ... a b c;b和c的值被提升为普通整型然后再执行加法运算。加法运算完成之后结果将被截断然后再存储于a中。 1、整型提升的意义 表达式的整型运算要在CPU的相应运算器件内执行CPU内整型运算器(ALU)的操作数的字节长度 一般就是int的字节长度同时也是CPU的通用寄存器的长度。因此即使两个char类型的相加在CPU执行时实际上也要先转换为CPU内整型操作数的标准长 度。通用CPUgeneral-purpose CPU是难以直接实现两个8比特字节直接相加运算虽然机器指令 中可能有这种字节相加指令。所以表达式中各种长度可能小于int长度的整型值都必须先转 换为int或unsigned int然后才能送入CPU去执行运算。 2、如何进行整体提升呢 整形提升是按照变量的数据类型的符号位来提升的无符号整形提升高位补0 举例 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {char a 5;//5用二进制为0000 0000 0000 0000 0000 0000 0000 0101//由于是char类型进行截断//0000 0101 - achar b 126;//126用二进制为0000 0000 0000 0000 0000 0000 0111 1110//进行截断//0111 1110 - bchar c a b;//a,b整型提升//a - 0000 0000 0000 0000 0000 0000 0000 0101//b - 0000 0000 0000 0000 0000 0000 0111 1110//c - 0000 0000 0000 0000 0000 0000 1000 0011//截断 c - 1000 0011printf(%d\n, c);//%d 十进制的方式打印有符号数//c整型提升//1111 1111 1111 1111 1111 1111 1000 0011 - 补码//1111 1111 1111 1111 1111 1111 1000 0010 - 反码//1000 0000 0000 0000 0000 0000 0111 1101 - 原码-125//c也就是-125return 0; }运行结果 2. #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {char a 0xb6;short b 0xb600;int c 0xb6000000;if (a 0xb6)printf(a);if (b 0xb600)printf(b);if (c 0xb6000000)printf(c);return 0; }运行结果 为什么会这样呢原因a,b要进行整形提升,但是c不需要整形提升a,b整形提升之后,变成了负数,所以表达式 a等于0xb6 , b等于0xb600 的结果是假,但是c不发生整形提升,则表达式 c0xb6000000 的结果是真. int main() {char c 1;printf(%u\n, sizeof(c));printf(%u\n, sizeof(c));printf(%u\n, sizeof(-c));return 0; }c只要参与表达式运算,就会发生整形提升,表达式 c ,就会发生提升,所以 sizeof(c) 是4个字 节.表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节,但是 sizeof© ,就是1个字节. 2、算术转换 如果某个操作符的各个操作数属于不同的类型那么除非其中一个操作数的转换为另一个操作数的类型否则操作就无法进行。下面的层次体系称为寻常算术转换。 如果某个操作数的类型在上面这个列表中排名较低那么首先要转换为另外一个操作数的类型后执行运算警告 但是算术转换要合理要不然会有一些潜在的问题 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.hint main() {float f 3.14;int sum f;printf(%f, sum);return 0; }运行结果 3、操作符的属性 复杂表达式的求值有三个影响的因素。 操作符的优先级操作符的结合性是否控制求值顺序。 两个相邻的操作符先执行哪个 取决于他们的优先级。如果两者的优先级相同取决于他们的结合性。 操作符优先级见下图从上到下优先级从高到低 操作符描述用法示例结果类型结核性是否控制求值顺序()聚组表达式与表达式相同N/A否函数调用rexp(rexp,rexp,…,rexp)rexpL-R否[ ]下标引用rexp[rexp]lexpL-R否.访问结构成员lexp.member_namelexpL-R否-访问结构指针成员rexp-member_namelexpL-R否后缀自增lexp rexpL-R否--后缀自减lexp - -rexpL-R否!逻辑反!rexprexpR-L否~按位取反~rexprexpR-L否单目表示正值rexprexpR-L否-单目表示负值-rexprexpR-L否前缀自增lexprexpR-L否- -前缀自减- -lexprexpR-L否*间接访问*rexplexpR-L否取地址lexprexpR-L否sizeof取其长度以字节表示sizeof(rexp),siaeof(类型int等rexpR-L否类型类型转换类型rexprexpR-L否*乘法rexp * rexprexpR-L否/除法rexp/rexprexpL-R否%整数取余rexp % rexprexpL-R否加法rexp rexprexpL-R否-减法rexp - rexprexpL-R否左移位rexprexprexpL-R否右移位rexpL-R否大于rexprexprexpL-R否大于等于rexprexprexpL-R否小于rexprexprexpL-R否小于等于rexprexprexpL-R否等于rexprexprexpL-R否!不等于rexp!rexprexpL-R否位与rexorexprexpL-R否^位异或rexp^rexprexpL-R否I位或rexp I rexprexpL-R否逻辑与rexprexprexpL-R是II逻辑或rexp II rexprexpL-R是条件操作符rexp?rexp:rexprexpN/A是赋值lexprexprexpR-L否以…加lexp rexprexpR-L否-以…减lexp - rexprexpR-L否*以…乘lexp * rexprexpR-L否/以…除lexp / rexprexpR-L否%以…取模lexp % rexprexpR-L否以…左移lexp rexprexpR-L否以…右移lexp rexprexpR-L否以…与lexp rexprexprexpR-L^以…异或lexp ^ rexprexpR-L否I以…或lexp I rexprexpR-L否逗号rexp,rexprexpL-R是 一些问题表达式 我们清楚表达式的求值部分是由操作符的优先级决定的但在一些复杂表达式中就会出现多种可能此时便是由我们所用的编译器决定 表达式1 ab cd e*f 表达式1在计算的时候由于 * 比 的优先级高只能保证的计算是比早但是优先级并不能决定第三个比第一个早执行 所以表达式1的计算顺序可能是 ab cd abcd ef abcdef 或者 ab cd ef abcdef 表达式2 c --c 同上操作符的优先级只能决定自减–的运算在的运算的前面但是我们并没有办法知道操作符的左操作数的获取在右操作数之前还是之后求值所以结果是不可预测的是带有歧义的。 表达式3 int main() {int i 10;i i-- - --i * (i -3) * i i;printf(i %d\n,i);return 0; }此表达式为非法表达式在不同的编译器所得结果不同。 表达式4 int fun() {static int count 1;return count; }int main() {int answer;answer fun() - fun() * fun();printf(%d\n,answer);retuen 0; }这个代码有问题吗 有问题 虽然在大多数编译器求得的结果是相同的。 但是上述代码 answer fun() - fun() * fun();中我们只能通过操作符的优先级的得知先算乘法再算减法。 函数调用的先后顺序无法通过优先级确定。 表达式5 #include stdio.hint main() {int i 1;int ret (i) (i) (i);printf(%d\n,ret);printf(%d\n,i);return 0; }我们同样会发现在Linux中的gcc编译器和用VS编译器所得结果不同。 原因这段代码第一个在执行的时候第三个是否执行这个是不确定的 总结 我们写出的表达式如果不能通过操作符的属性确定唯一的计算路径那这个表达式就是存在问题的。
http://www.w-s-a.com/news/142741/

相关文章:

  • 培训课程网站网上下载的网站模板怎么用
  • 重庆山艺网站建设塘厦理工学校
  • 做网站的人叫什么软件玩具网站设计
  • 网站说服力营销型网站策划 pdf深圳有什么公司名称
  • 做物流的可以在那些网站找客户男生晚上正能量你懂我意思
  • 宁德市城乡住房建设厅网站教育机构logo
  • 做定制网站价格有网站了怎么做app
  • 做网站和制作网页的区别北京朝阳区最好的小区
  • 网站策划 ppt北京装修公司排名推荐
  • 郑州网站建设公司哪家专业好如何注册一家公司
  • 证券投资网站做哪些内容滨州论坛网站建设
  • 重庆网站建设公司模板广东佛山
  • 中展建设股份有限公司网站做网站备案是什么意思
  • 石家庄网站建设接单wordpress功能小工具
  • 有没有专门做网站的网站镜像上传到域名空间
  • 网站建设中 windows买域名自己做网站
  • 设计英语宁波seo做排名
  • 奉贤网站建设上海站霸深圳几个区
  • c#做网站自已建网站
  • 成都地区网站建设网站设计类型
  • 如何做网站结构优化北京响应式网站
  • 出售源码的网站威海住房建设局网站
  • 网站建设补充报价单网站建设 技术指标
  • 做网站费用分摊入什么科目做网络网站需要三证么
  • 房屋备案查询系统官网杭州排名优化软件
  • 网站地图html网络营销的流程和方法
  • 注册好网站以后怎么做wordpress 获取插件目录下
  • 南京做网站dmooo地方网站需要什么手续
  • 网站开发合同有效期omeka wordpress对比
  • 杭州设计网站的公司广州网站改版领军企业