土木在线论坛 \ 电气工程 \ 建筑智能化 \ C语言的一些误用和知识总结

C语言的一些误用和知识总结

发布于:2017-10-13 19:10:13 来自:电气工程/建筑智能化 [复制转发]
在学习单片机的时候才真正知道C 语言是什么它是来干什么的 ~ 但是 C 语言用到嵌入式只是它小小的一部分他的应用还有很多地方呢,呵呵我们这里就不讨论这个了。我们是不是在写程序的时候错误很多就算编译通过了也达不到我们预期的结果,完了自己是不是也很难找到错在哪儿吧 ? 我绝得语言之所以能称之为语言,它肯定是一种工具一种相互交流相互通信相互传达之间的意图的工具,作为语言那肯定得有自己的语法,要想相互交流肯定得先学好它的语法吧 ( 比如像表达式,函数,循环,指针 ) 我称之为 C 语言的语法。 C 语言虽然很强大但是他也有不少陷阱,所以我发这篇博客有两个目的一是:把 C 语言一些误用易错的地方总结一下,二是把 C 语言一些基本语法总结一下 ~
第一次:
1. 关于自增自减 ( ++i,i++)
要想给一个数加一或减一我们可以:
i += 1;
j -= 1;
C 语言还允许用 ++ -- 运算符,其实这里有误导,因为 ++ -- 可以作为前缀和后缀,这样的话他们就有可能改变操作数的值,下面让我们来看看:
i = 1;
printf("i is %d\n",++i); /* prints i is 2 */
printf("i is %d\n",i); /* prints i is 2 */
计算表达式i++ 的结果是 i, 但是会引发 i 随后进行自增:
i = 1;
printf("i is %d\n",i++); /* prints i is 1/ */
printf("i is %d\n",i); /* prints i is 2 */
第一个printf 显示了 i 自增前的原始值,第二个 printf 显示了 i 变化后的新值 ; 当然 -- 类似我就不举例了 ~
但在同一个表达式中多次使用++ -- 往往很难理解我们看看下面的例子:
i = 1;
j = 2;
k = ++i + j++;
i,j,k 最终值分别是 2,3,4 ++i 2 j++ 2;
总结:不管是++i 还是 i++ 执行这条语句后 i 的值都加一了只是 (++i) 的值加一了而 (i++) 没变,
2.typedef #define
2.1.typedef
C 语言除了直接使用标准的类型名 ( int char float double) 和自己声明的结构体、共用体、指针、枚举类型外,还可以用 typedef 声明新的类型名来代替现有的类型名。
typedef unsigned char u8;
typedef unsigned int u16;
u8 count;
u16 time;
typedef struct
{
u8 month;
u8 day;
u16 year;
}DATE;
DATE brithday;
总结一下,声明新的类型名的方法:
1. 先按定义变量的方法写出定义体 ( unsigned int i)
2. 在变量名换成新的变量名 ( 如将 i 换成 u16)
3. 在最前面加上 typedef (typedef unsigned int u16)
4. 然后用新类型名去定义变量
2.2 #define
2.1.1 不带参数的宏定义
#define 标识符 字符串
#define PI 3.1415926
注意:
1. 它的作用是在本程序中用指定的标识符 PI 来代替 3.1415926
2. 宏定义是用宏来代替字符串也就是做简单的置换,不做正确性检查如果写成
#define PI 3.l4l6926
即把1 写成了字母 l 但是预处理照常代入不做任何语法检查 !!
2.1.2 带参数的宏定义
#define 宏名 ( 参数 ) 字符串
#define S(a,b) a*b
area = S(a,b);
#define MAX(x,y) (x)>(y) ? (x):(y)
3.typedef #define 的区别
一般来说typedef 因为它能正确处理指针类型
typedef char *String1;
#define String2 char *
String1 s1,s2;
String2 s3,s4;
s1,s2,s3 被定义为了 char* s4 却被定义为了 char
3. static 变量
static 变量大致分为三种用法
1. 用于局部变量中 , 成为静态局部变量 . 静态局部变量有两个用法 , 记忆功能和全局生存期 .
2. 用于全局变量 , 主要作用是限制此全局变量被其他的文件调用 .
3. 用于类中的成员 . 表示这个成员是属于这个类但是不属于类中任意特定对象
1. 静态局部变量
静态局部变量属于静态存储方式,它具有以下特点:
(1) 静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(2) 允许对构造类静态局部量赋初值 例如数组,若未赋以初值,则由系统自动赋以 0 值。
(3) 对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予 0 值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
举例如下:
void fun()
{
static int a = 1;
a++;
}
在第一次进入这个函数的时候,变量a 被初始化为 1! 并接着自增 1 ,以后每次进入该函数, a 就不会被再次初始化了,仅进行自增 1 的操作 ; static 发明前,要达到同样的功能,则只能使用全局变量:
int a = 1;
void fun()
{
a++;
}

  • a317630398
    a317630398 沙发
    谢谢楼主的分享!
    2017-11-04 08:23:04

    回复 举报
    赞同0
这个家伙什么也没有留下。。。

建筑智能化

返回版块

12.4 万条内容 · 375 人订阅

猜你喜欢

阅读下一篇

消防报警室外管线的主干线路应预埋几根套管

请教一下各位大神,比如一个住宅小区,消防控制室集中设置在门卫处,那个由消防控制室引至各个单体的室外主干线路预埋管需要埋几根?各个单体的室外消防主干线路是否可以合用?谢谢各位大神指教

回帖成功

经验值 +10