当前位置: 首页 > news >正文

魔鬼数字c语言英语,C语言常见错误(一)

此篇为个人学习笔记:

数字和表达式错误

一、运算符号和优先的错误

1 = 和==,在判断语句中要时时注意

2 “++” “--”运算符

注意 a在表达式中不要再引用,其运算顺序是依赖编译器的。

b 必须为左值

我们来看一下这个程序

#include 

int main()

{

int a[10]={0};

int i=0;

a[i]=i++;

//(i+1)++;           //这一行是无法编译通过的,这是由于我们将其++展开,发现i+1=(i+1)++而等号左边必须得是左值,故会编译失败

((int *)p)++;     //error: lvalue required as increment operand  和上面的原因是一样的

printf("a[%d]=%d\n",i,a[i]);

return 0;

}

3 不要使用默认优先级,多使用括号

二、字节序的错误

1 网络序:是大端传输的。小端的意思是低字节放在低位,大端则刚好相反。intel系列都是小端,ppc系列都是大端。我们要注意的是,程序存储的时候,整体都是从低地址往高地址存储,大端和小端的区别是在每个元素存储时候的区别。我们来看下面的图示吧

依次输入 0x1234和0x5678

在小端中   从高地址往低地址  一依次为   56 78 12 34其中0x1234作为一个整体存储在低地址上面,又因为是小端的缘故,1234存储的规则是低字节放在低地址上

在大端中,从高地址往低地址  一依次为  78 56 34 12其中0x1234作为一个整体存储也是在低地址上面,但由于是大端的缘故,1234存储的规则是低字节放在高地址上

基于此,我们可以设计如下程序来判断小端和大端

#include

int main()

{

unsigned int a=0x12345678;

unsigned char b=(unsigned char)a;

printf("%x\n",b);

return 0;

}

如果输出为78则为小端,输出为12则为大端。

2 结构体中大端和小端,看下面的一个结构体

#include

union

{

unsigned int uiAddr;

unsigned char aucAddr[4];

}st;

int main()

{

st.aucAddr[0]=192;

st.aucAddr[1]=3;

st.aucAddr[2]=2;

st.aucAddr[3]=1;

printf("%x\n",st.uiAddr);

return 0;

}

在小端中结果为 01 02 03 c0大端结果为c0 03 02 01

3指针强制转换中 大端小端的问题,这个比较简单,大家自己编码下即可

三、魔鬼数字

魔鬼数字指得是直接使用具体数字而不是定义好的宏,常量,或者枚举。

原因如下:一方面可读性不好,另一方面修改不统一。

四、宏定义错误:没有使用足够的括号来保证展开的正确性,小的要加,总的也要加,如下面的一个例子

#include

#define M(a,b) (a*b)

#define N(a,b) ((a)*(b))

int main()

{

printf("%d\n",M(1+2,5));

printf("%d\n",N(1+2,5));

return 0;

}

结果为11  15可见差别还是很大的

五、sizeof错误

1、指针与结构体大小

2、#pragma pack(1)

...

#pragma pack(0)

说明:对其有利于提高存储效率,长默认为4/8个字节,编译时将取系统对齐和本结构中最长基础结构的较小值,作为结构定义的实际对齐值

2 报文结构中一般按照pack(1)来定义的

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 洛神赋
  • C语言猜小偷思路,谁是小偷,求高手指教。怎么编写这个程序
  • Windows XP SP3下载(预发布RC1版)
  • android动态style,Android控件动态设置style的问题
  • Linux 同步方法剖析
  • mate8 android版本区别,华为Mate8有几个版本 华为Mate8各版本区别
  • Java SE 6 新特性: Instrumentation 新功能
  • 简述linux系统的发展史,Linux系统概括发展历史
  • Java SE 6 新特性: HTTP 增强
  • 鸿蒙os的速度和ios,升级鸿蒙OS2.0后的体验,和ios基本没差别
  • Java SE 6 新特性: JMX 与系统管理
  • android 3D球面的点,使用D3.js创建3D球面圆点环绕动画(带详细注解)
  • Java SE 6 新特性: 对脚本语言的支持
  • Java SE 6 新特性: XML API 与 Web 服务
  • 今天又要去照相
  • exports和module.exports
  • iOS 颜色设置看我就够了
  • mysql 数据库四种事务隔离级别
  • Sass 快速入门教程
  • STAR法则
  • 给Prometheus造假数据的方法
  • 给第三方使用接口的 URL 签名实现
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 使用Swoole加速Laravel(正式环境中)
  • 微服务入门【系列视频课程】
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 原生Ajax
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Java总结 - String - 这篇请使劲喷我
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • #WEB前端(HTML属性)
  • (35)远程识别(又称无人机识别)(二)
  • (C++哈希表01)
  • (C11) 泛型表达式
  • (C语言)二分查找 超详细
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (黑马点评)二、短信登录功能实现
  • (论文阅读11/100)Fast R-CNN
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (三)elasticsearch 源码之启动流程分析
  • (三十五)大数据实战——Superset可视化平台搭建
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转) RFS+AutoItLibrary测试web对话框
  • (转载)hibernate缓存
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .gitignore文件_Git:.gitignore
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET C# 使用GDAL读取FileGDB要素类
  • .Net core 6.0 升8.0
  • .net core使用RPC方式进行高效的HTTP服务访问