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

简介: 嵌入式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


四、位运算


掩码的使用

&:按位与

|:按位或

^:按位异或(相同为0,不同为1)

~:按位取反

>>: 按位右移

<<:按位左移


编程练习


题目:统计一个整数的二进制中有多少个1

0a2653c851af460fa595bd959398a8f1.png

可以通过掩码进行位操作,如: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;
}


相关文章
|
2月前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
79 1
|
2月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
82 1
|
14天前
|
Linux
linux常用运算符
运算符 第一种方式 a=$((2+2)) 第二种方式 b=[表达式] 第三种方式 c=`expr 2 + 3` \* 乘法要转义
|
27天前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
22 4
|
2月前
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
58 4
|
2月前
|
消息中间件 安全 Java
【嵌入式软件工程师面经】Linux多进程与多线程
【嵌入式软件工程师面经】Linux多进程与多线程
35 1
|
2月前
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
34 1
|
3月前
|
存储 Linux Shell
Linux|Awk 变量、数字表达式和赋值运算符
Linux|Awk 变量、数字表达式和赋值运算符
41 2
|
3月前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
该文指出了学习嵌入式Linux开发的两个常见误区。一是过分专注于学习桌面或服务器版Linux,而非关注嵌入式开发本身,实际上只需熟悉基本操作即可。二是试图在没有基础的情况下直接阅读Linux内核源代码,这是不切实际的,应先建立基础知识再进行源码学习。文章还提到了在嵌入式系统中获取和处理屏幕数据的示例,包括使用gsnap工具将framebuffer数据转为图像,以及涉及的交叉编译过程。
30 0
|
3月前
|
Linux 编译器 测试技术
嵌入式 Linux 下的 LVGL 移植
嵌入式 Linux 下的 LVGL 移植
150 0