C语言中关于三目运算符的注意事项
C语言中常见的条件运算符?:在运算符优先级中排行13。部分时候可以代替if……else语句,使代码更加简洁。但是更容易隐含一些不易觉察的错误。
最近接了一个项目,本来通信协议部分很简单,自己的STM32控制器通过中断方式接收帧数据,每帧23个字节,其中前4个字节是帧头(校验的关键字)。结果就在这里出现了错误,而且这个小小的错误花费了一天时间来查找。对于一个周期很紧的项目来说,在这种小问题上花费这么长时间代价可谓不小。写此贴以警醒自己曾经犯得错误,也希望偶尔看到的朋友可以避免同样的错误。
1、三目运算符定义
condition ? expression1 : expression2
expression1和expression2是两个操作数。如果condition = true,则结果为expression1,否则为expression2.
2、项目中利用三目运算符进行帧头判断时出现的问题
if(CountFlag == ) //Frame head 0xAA
{
CountFlag = ((unsigned char)UsartReceiveData[CountFlag] != 0xAA)? : CountFlag++;
// CountFlag = (ReceiveData != 0xAA)? 0 : CountFlag++;
// if((unsigned char)UsartReceiveData[CountFlag] == 0xAA)
// {
// CountFlag++;
// }
// else
// {
// CountFlag = 0;
// } }
else if(CountFlag == ) //Frame head 0xAA
CountFlag为变量(帧字节位置计数变量),定义为unsigned int类型。
本意为了避免注释中的if……else结构代码行数过多,而采用了三目运算符结构,代码的结构和逻辑均非常简单。但是意想不到的事情发生了。
无论从机发送的帧头数据正确还是错误,程序只执行CountFlag == 0这一种情况。why? 百思不得其解。
如果采用注释中的的if……else结构则数据收发正确,说明问题就出在三目运算符表达语句上。然后专门写了一个三目运算符的测试程序。调试发现按照这种结构,即使if语句为真,该语句也不执行?看了几遍也没有发现逻辑错误。问度娘也没有找到有价值的参考。
将CountFlag++改写为CountFlag + 1,则结果正确。至此问题已经找到答案。
3、错误原因
CountFlag++的结果仍然是一个变量,假设初值为0,执行完后表达式的值即CountFlag变量的值为1,这个值1存放在CountFlag变量中。
CountFlag + 1的结果是一个常量, 假设初值为0,执行完后表达式的值即值为1,注意结果是常量。
这种平时习以为常的东西,不是什么大问题的东西,最容易让人忽略。以后引以为戒。
C语言中关于三目运算符的注意事项的更多相关文章
- 【编程开发】C语言中随机数rand使用注意事项
[编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...
- C语言中的运算符
1. 在C语言中运算符包括:算术运算符.关系运算符.赋值运算符.逻辑运算符 2.用运算符把变量.常量连接起来的式子就是表达式 3.我们阅读一个表达式,从表达式的功能和表达式的值来看 4. 算术运算符和 ...
- C 语言中的指针和内存泄漏
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...
- C语言中的指针和内存泄漏
引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ...
- 【转载】如何在C语言中调用shell命令
转载自:http://blog.csdn.net/chdhust/article/details/7951576 如何在C语言中调用shell命令 在linux操作系统中,很多shell命令使用起来非 ...
- c语言中数组相关问题
c语言中数组相关问题: 1.数组基本定义: 相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组成数组 ...
- Java中的三目运算符 详解
对于有些选择分支结构,可以使用简单的条件运算符来代替. 如: if(a<b) min=a;else min=b; 可以用下面的条件运算符来处理 min=(a<b)?a:b; 其 ...
- C语言中内存分配 (转)
在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...
- 《C语言深度剖析》学习笔记----C语言中的符号
本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...
随机推荐
- KEEP!
[list][*]别问我前端有没有前途,我不知道,我只知道我现在喜欢前端,以后也应该喜欢.[*]别问我前端的工作好不好找,不管哪一职位,工作好不好找都是看你的水平.[*]别问我前端累不累,这世界就没有 ...
- php根据用户输入单词,匹配相似单词
最近在使用一款app背单词的时候,会在某个单词下面,列出与之相类似的单词.于是我在想这个功能是如何做的,自己使用php版本,做了个简单的例子. 大致思路如下: 1.生成英文单词库,并将单词放置redi ...
- oracle目录操作
1.创建目录 create directory dir_name as 'dir_path' (dir_path必须事先手动创建) 2.授权 grant read,write on director ...
- mac air 上的Linux命令训练(1)
1.cat命令 作用: 读取一个文件的全部内容,并将它输出,如果将它输出到一个目标文件,目标文件将会被替换掉. 参数: -n : 加上行号输出 -b:加上行号,但是不加空白行,输出 -s:当遇到多行空 ...
- ACM 子串和
子串和 时间限制:5000 ms | 内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最 ...
- 1022: [SHOI2008]小约翰的游戏John
1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1322 Solved: 829[Submit][ ...
- SQL-ROW_NUMBER() OVER函数的基本用法(源码案例)
SELECT SUM(t.AdjustedBalance) AS Allqmye FROM ( SELECT * FROM ( SELECT ROW_NUMBER() OVER ( PARTITION ...
- ORM-Dapper学习<二>
Dapper的简介 Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的.Dapper只有一个代码文件,完全开源,你 ...
- PHP语言开发微信公众平台(订阅号)之注册
1.百度搜索"微信公众平台" 2.选择微信公众平台官网并单击打开 3.进入官网页面,单击 "立即注册" 进入注册页面 4.进入注册页面,单击订阅号 5.进入订阅 ...
- MIT 计算机科学及编程导论 Python 笔记 1
计算机科学及编程导论在 MIT 的课程编号是 6.00.1,是计算机科学及工程学院的经典课程.之前,课程一直使用 Scheme 作为教学语言,不过由于 Python 简单.易学等原因,近年来已经改用 ...