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语言中关于三目运算符的注意事项的更多相关文章

  1. 【编程开发】C语言中随机数rand使用注意事项

    [编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...

  2. C语言中的运算符

    1. 在C语言中运算符包括:算术运算符.关系运算符.赋值运算符.逻辑运算符 2.用运算符把变量.常量连接起来的式子就是表达式 3.我们阅读一个表达式,从表达式的功能和表达式的值来看 4. 算术运算符和 ...

  3. C 语言中的指针和内存泄漏

    引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...

  4. C语言中的指针和内存泄漏

    引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ...

  5. 【转载】如何在C语言中调用shell命令

    转载自:http://blog.csdn.net/chdhust/article/details/7951576 如何在C语言中调用shell命令 在linux操作系统中,很多shell命令使用起来非 ...

  6. c语言中数组相关问题

    c语言中数组相关问题: 1.数组基本定义: 相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组成数组 ...

  7. Java中的三目运算符 详解

    对于有些选择分支结构,可以使用简单的条件运算符来代替. 如: if(a<b)    min=a;else    min=b; 可以用下面的条件运算符来处理 min=(a<b)?a:b; 其 ...

  8. C语言中内存分配 (转)

    在任何程序设计环境及语言中,内存管理都十分重要.在目前的计算机系统或嵌入式系统中,内存资源仍然是有限的.因此在程序设计中,有效地管理内存资源是程序员首先考虑的问题. 第1节主要介绍内存管理基本概念,重 ...

  9. 《C语言深度剖析》学习笔记----C语言中的符号

    本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...

随机推荐

  1. Laravel事件Event

    适用场景:记录文章浏览量 php artisan make:event 事件名 示例: php artisan make:event MyEvent Laravel目录\app\Events已经生成M ...

  2. JavaScript设计模式之构造器、模块和原型

    JavaScript面向对象 JavaScript是一种无类语言,但可以使用函数来模拟,这就涉及到设计模式.模式是一种已经验证过的可复用的解决方案,可用于解决软件设计中遇到的常见的问题,通常将这些解决 ...

  3. swiper插件的使用demo

    老习惯,废话不多说,直接上代码 1.PC端,swiper2,滑动效果 先要引入idangerous.swiper2.7.6.css和idangerous.swiper2.7.6.js(需要先引入jqu ...

  4. The Art of Prolog:Advanced Programming Techniques【译文】

    申明:此文为译文,仅供学习交流试用,请勿用作商业用途,造成一切后果本人概不负责,转载请说明.本人英语功力尚浅,翻译大多借助于翻译工具,如有失误,欢迎指正. 逻辑程序简介 逻辑程序是一组公理或规则,定义 ...

  5. KoaHub平台基于Node.js开发的Koa的连接MongoDB插件代码详情

    koa-mongo MongoDB middleware for koa, support connection pool. koa-mongo koa-mongo is a mongodb midd ...

  6. 算法模板——Dinic网络最大流 1

    实现功能:同sap网络最大流 今天第一次学Dinic,感觉最大的特点就是——相当的白话,相当的容易懂,而且丝毫不影响复杂度,顶多也就是代码长个几行 主要原理就是每次用spfa以O(n)的时间复杂度预处 ...

  7. 去除IOS浏览器下面的工具栏

    在head标签里添加下面的元素 即可 <meta id="viewport" name="viewport" content="width=de ...

  8. Centos下PXE+Kickstart无人值守安装操作系统

    一.简介 1.1 什么是PXE PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持 ...

  9. iOS开发之清除缓存

    NSFileManager *mgr = [NSFileManager defaultManager]; NSString *cachePath = [NSSearchPathForDirectori ...

  10. CentOS 下安装 Node npm pm2

    1.node安装 参考:http://blog.csdn.net/haidaochen/article/details/7257655 下载,你需要在https://nodejs.org/en/dow ...