嵌入式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
附
- 获取掩码,掩码计算
位掩码(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;
}
分类:
嵌入式Linux C语言
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理