嵌入式Linux C(三)——运算符及表达式

一、自增、自减运算符

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<j,返回j

四、位运算

掩码的使用
&:按位与
|:按位或
^:按位异或(相同为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

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;
}

参考:c语言将十进制数转换为16进制的函数

posted @ 2022-01-13 16:01  周末不下雨  阅读(34)  评论(0编辑  收藏  举报