一、自增、自减运算符
i++;
//过去的笔试题 i = 2; //例:i++; //i++结束标志,是一行最后的;或者函数的()还有,逗号 int num = (i++) + (i++) + (i++) + (i++); printf("num = %d\n",num); printf("i = %d\n"); //num 有两个输出结果的可能,i结果都是6 //结果1:14 num = 2 + 3 + 4 + 5 //结果2:8 num = 2 + 2 + 2 + 2 //例:++i; int num = (++i) + (++i) + (++i) + (++i); //num结果是19 //先(++i) + (++i),进行括号内计算,即4 + 4 //则num = 4 + 4 + 5 + 6 //例:i++、++i综合 int num = (i++) + (++i) + (i++) + (++i); //先看双目运算,遇到i++就先进行运算 //i = i + 1; //int num = 3 + 3;//i = i + 1 4 //num = 6 + 4;// i = i + 1 5; //i = i + 1; 6 //num = 10 + i = 16; i = i * ((i++) + (++i)) //num = 24 //如果按;号结束,就是18
//现在的笔试题 //传参从最==右==边开始 void func(int a,int b) { printf("a = %d\n",a); printf("b = %d\n",b); } int main() { int i = 2; func(i++,++i);//func(3,i) //1. 函数传参,从右到左 //2. ++i被替换成变量名 //3. i++被替换成变量值 return 0; //所以,a = 3,b = 4 } int main() { int i = 2; func(++i,++i);//func(i,i) //1. 函数传参,从右到左 //2. ++i被替换成变量名 //3. i++被替换成变量值 return 0; //所以,a = 4,b = 4 } printf("%d,%d,%d,%d,%d",i++,++i,i++,++i,++i); //一样传参,答案:6,7,4,7,7 char *ptr = "abcdefghgk"; printf("%c,%c,%c,%c,%c",*ptr,*(ptr++),*(++ptr),*(ptr++),*(++ptr)); //有点不一样,但差不多,自己体会 //答案:e,d,d,b,b
二、关系运算符
推荐书写格式
int num if(5 == num)//将常量写在左边 { }
三、运算符
&& || !
半开与,半开或,看前半部分的逻辑半段
int max = i > j ? i : j;
若i>j,返回i
若i
四、位运算
掩码的使用
&:按位与
|:按位或
^:按位异或(相同为0,不同为1)
~:按位取反
>>: 按位右移
<<:按位左移
编程练习
题目:统计一个整数的二进制中有多少个1
可以通过掩码进行位操作,如:0X80000000,0X00000001
保留/清零/置位一个整数的32位二进制数的m-n位:8-15(从0开始计数)
0001 1100 0001 1101 1111 0001 1101 1100
0000 0000 0000 0000 1111 1111 0000 0000//mask位掩码
1111 1111 1111 1111 0000 0000 1111 1111//~mask
mask生成
mask = ((~0) >> (32 - (n - m) - 1)) << m;
0000 0000 0000 0000 1111 0001 0000 0000 保留 & mask
0001 1100 0001 1101 0000 0000 1101 1100 清零 & ~mask
0001 1100 0001 1101 1111 1111 1101 1100 置位 | mask
0001 1100 0001 1101 0000 1110 1101 1100 取反 ^ mask
附
获取掩码,掩码计算
位掩码(BitMask)的介绍与使用
不用第三变量实现两个数的对换
a = 3; b = 4; a = a ^ b; b = a ^ b; a = a ^ b;
C语言性能优化:使用位运算(左移就是除以2,,右移就是乘以2)
作业
输入任意十进制数,转化成十六进制数
#include <stdio.h> #include <stdlib.h> char buffer [33]; //用于存放转换好的十六进制字符串,可根据需要定义长度 char * inttohex( int aa) { sprintf (buffer, "%x" , aa); return (buffer); } int main () { int num; char * hex_str; printf ( "Enter a number: " ); scanf ( "%d" ,&num); hex_str = inttohex (num); printf ( "Hexadecimal number: %sH\n" , hex_str); return 0; }