嵌入式C语言的运算符与输入输出

目录

1. 运算符

1.1 位运算符

1.1.1 位运算 ~

1.1.2 位逻辑与 &

 1.1.3 位逻辑或 |

1.1.4 位逻辑异或 ^

1.1.5 位移位运算

1.1.6 将无符号位的某位快速置 1

1.2 三目运算符

 1.3 逗号运算符

 1.4 运算符优先级

 2. 输出

2.1 字符输出函数

2.2 格式输出函数

2.3 字符串输出函数

 3. 输入

3.1 字符输入函数

3.2 格式输入函数

 3.3 垃圾遗留

 3.4 字符串输入函数


1. 运算符

算术运算符  关系运算符  逻辑运算符老生常谈

需要记住:

算术运算符 :float 与 double 数据类型的变量不可以进行取余操作

逻辑运算符:&&(与)都为真才为真(数字 1 表示真,0 表示假);|| (或)有一个为真便为真

1.1 位运算符

嵌入式开发中使用 C 语言的位运算符

其运算效率比算术运算符的效率要高;

涉及硬件时离不开寄存器,可以借助位运算对数据进行修改

1.1.1 位运算 ~

以下测试中,char 声明为无符号型,取反时符号位也要参与计算

1.1.2 位逻辑与 &

 1.1.3 位逻辑或 |

1.1.4 位逻辑异或 ^

1.1.5 位移位运算

1.1.6 将无符号位的某位快速置 1

1.2 三目运算符

表达式1 ? 表达式 2 :表达式 3

即表达式 1 成立,执行 表达式 2 ,表达式 1 不成立,执行 表达式 3

 1.3 逗号运算符

作用:按从左到右的顺序依次执行每个子表达式,并返回最后一个子表达式的值。

 1.4 运算符优先级

 2. 输出
2.1 字符输出函数

格式:putchar( c )

c 为字符常量,变量或表达式

2.2 格式输出函数

格式:printf ( “%m.nd/x/o”,a )

按指定格式向显示器输出数据

 %md:m < 该数的位数,按实际输出;若大于,输出数前面有空格;

%m.nf:保留小数点后 n 位,域宽为 m ;

 0:左边空格补 0 ;

+:有符号的正整数前显示正号;

2.3 字符串输出函数

格式:puts ()

说明:使用其会自动换行

 3. 输入
3.1 字符输入函数

格式:getChar( ) ;

从键盘读一个字符,返回读取的代码值,出错或结束返回 -1

3.2 格式输入函数

格式:scanf (”格式控制串“,地址表 ) ;

scanf 使用时记得使用取地址符:&

空格作为字符串输入结束的标志

 输入十六进制,输出 十进制;

 获取 scanf 输入数据的个数:

 scanf 中 %md 的使用:自动划分输入的数据

 抑制符:*

 字符型变量输入:用 “ %c ” 格式符时,空格和转移字符作为有效字符输入

(对于整数:输入时按空格,tab 键,回车都不影响最后的输出)

 3.3 垃圾遗留

如下,输入整数之后,遗留的“回车”会输入到 scanf ("%c",&x) ,成为垃圾符号

影响下一次字符的输入

 方法一:添加 getchar( ) ;

 方法二:scanf ("%c",&x) 格式串加上空格或者 %*c;

 3.4 字符串输入函数

一般使用字符数组存储字符串

格式:gets( );

输入串长度应小于字符数组长度(字符串默认以" \0" 结尾

 不会以空格作为输入结束的标志

 若用 scanf( )输入字符串,不能有空格

空格相当于结束符

若要输入空格,可以使用 for 循环

### 嵌入式开发中的C语言运算符使用教程 #### 1. 运算符优先级的重要性 在嵌入式开发中,理解运算符的优先级至关重要。如果依赖复杂的表达式求值顺序而不明确指定优先级,可能导致逻辑错误或难以调试的结果。例如,在计算PWM占空比时,如果没有正确处理乘法、除法和取模的操作顺序,则可能得到不正确的结果[^2]。 ```c // 错误代码示例 duty = freq * 1000 / period % 100; // 改进后的代码 duty = ((freq * 1000) / period) % 100; ``` 通过添加括号来明确表达式的意图可以显著提高代码的可读性和可靠性。 --- #### 2. 特殊运算符的应用 ##### (1)逗号运算符 逗号运算符可以在单条语句中执行多个操作,这在批量初始化硬件寄存器时非常有用。然而,应谨慎使用以保持代码清晰度。 ```c void Init_GPIO(void) { GPIOA->MODER = 0x01, GPIOA->OTYPER = 0x00; // 顺序执行两条赋值语句 } ``` 尽管上述写法简洁,但在实际项目中建议拆分为多行以便于维护和阅读。 --- ##### (2)`sizeof` 和指针 `sizeof` 是一种编译时常量表达式,用于获取数据类型的大小或者数组长度。它常被用来动态分配内存空间以及计算数组元素数量。 ```c #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0])) int array[] = {1, 2, 3, 4}; printf("Array size is: %zu\n", ARRAY_SIZE(array)); // 输出:4 ``` 注意:此宏仅适用于局部定义的固定大小数组,对于指向堆上分配区域的指针则无法工作。 --- ##### (3)三元条件运算符 三元条件运算符提供了一种更为紧凑的方式来实现简单的分支判断功能。相比于传统的 `if...else` 结构更加节省空间并提升性能。 ```c RCC->CFGR = (sysclk_src == HSE) ? RCC_CFGR_SW_HSE : RCC_CFGR_SW_HSI; ``` 以上例子展示了如何利用三元运算快速切换系统时钟源配置选项而无需额外增加冗余代码块。 --- #### 3. 算术运算注意事项 在进行数值计算过程中需特别留意以下几个方面: - **类型匹配**:确保参运算的数据具有相同精度等级;否则可能发生隐式转换从而引起意外行为。 - **溢出风险**:大整型相乘容易超出目标存储范围造成截断现象。 - **零分母防护机制**:任何时候都不得让除数等于零以免触发运行期异常中断程序流程。 下面给出一段示范性的交互界面让用户输入两组参数后展示基本四则运算成果的同时也体现了良好实践习惯——即先验证再操作的原则[^3]。 ```c #include <stdio.h> int main() { int a = 0, b = 0; int c = 0; printf("Input two integers separated by space:"); if(scanf("%d%d", &a, &b)!=2){ fprintf(stderr,"Invalid input.\n"); return -1; } if(b==0){ fprintf(stderr,"Division by zero error!\n"); return -1; } c = a + b; printf("Sum of A and B:%d\n",c); c = a - b; printf("Difference between A and B:%d\n",c); c = a * b; printf("Product of A times B:%d\n",c); c = a / b; printf("Quotient when dividing A over B:%d\n",c); c = a % b; printf("Remainder after division operation on A divided into parts sized as per value given under label 'B':%d\n",c); return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值