站外推广方式,长春高档网站建设,怎么免费做网站推广,怎么做网站链接广告此篇为个人学习笔记#xff1a; 数字和表达式错误 一、运算符号和优先的错误 1 和#xff0c;在判断语句中要时时注意 2 “” “--”运算符 注意 a在表达式中不要再引用#xff0c;其运算顺序是依赖编译器的。 b 必须为左值 我们来看一下这个程序 #include int main() { i… 此篇为个人学习笔记 数字和表达式错误 一、运算符号和优先的错误 1 和在判断语句中要时时注意 2 “” “--”运算符 注意 a在表达式中不要再引用其运算顺序是依赖编译器的。 b 必须为左值 我们来看一下这个程序 #include int main() { int a[10]{0}; int i0; a[i]i; //(i1); //这一行是无法编译通过的这是由于我们将其展开发现i1(i1)而等号左边必须得是左值故会编译失败 ((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 a0x12345678; 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(12,5)); printf(%d\n,N(12,5)); return 0; } 结果为11 15可见差别还是很大的 五、sizeof错误 1、指针与结构体大小 2、#pragma pack(1) ... #pragma pack(0) 说明对其有利于提高存储效率长默认为4/8个字节编译时将取系统对齐和本结构中最长基础结构的较小值作为结构定义的实际对齐值 2 报文结构中一般按照pack(1)来定义的