嵌入式基础 –价值观和副作用

许多嵌入式软件开发人员学会了实时为嵌入式系统编程。结果通常是对该语言的非正式介绍,但往往会遗漏关键术语并造成理解空白。让我们探讨一些开发人员常常会误解的常见C编程语言概念。

Featured_circuit

通常,在职业生涯的早期,开发人员会将副作用误认为是其程序中发生的不良情况。开发人员的构想离事实还很远。副作用只是说明执行环境的状态有变化。副作用可能很简单,例如为变量分配值,将数据写入磁盘或执行计算。在某些情况下,副作用可能是坏消息,例如在由assert评估的表达式中。

许多电气工程师变成了嵌入式软件开发人员,他们也不会接触到左值或右值。许多开发人员可以对左值或右值真正是什么的无知幸福进行编程,直到他们出现在编译器警告或错误消息中为止。有趣的是,在ANSI-C标准中,左值和右值没有定义明确的定义。左值的基本思想是它是一个引用内存中对象的表达式。可以将内存中的对象视为可以设置和操作的变量或可修改对象。考虑一下

int Var = 2;

Var是左值,其名称来自运算符的左侧。在上面的示例中,数字常量2是一个右值。 C语言将值2视为表达式,但它不代表内存中的对象,因此无法修改。考虑如下所述尝试为2分配新值:

2 =无功;

在这种情况下,编译器将尝试表达式2,即一个不代表内存中对象的右值,试图为其设置新值。编译器将声明需要一个左值,而不编译程序。

聪明的开发人员通常被认为是实时系统中的危险特征,可以利用必需的左值效应来确保等价表达式中不会意外遗漏等号。以下面的条件为例

if(Var = 2)

{

/ *做一些有用的事情。 * /

}

条件表达式具有副作用,即对象Var的值设置为2。是出于故意还是拼写错误?如果副作用是缺少=的错字,则会向程序引入一个错误,该错误可能对开发人员而言并不明显。该条件可以重写如下:

if(2 =变量)

{

/ *做一些有用的事情。 * /

}

上面的表达式将尝试分配一个右值,并会导致编译器错误。是的,刚刚发现一个错字,可能导致错误!将正确的表达式写为

if(2 ==变量)

{

/ *做一些有用的事情。 * /

}

将正确编译。评估一个右值以查看它是否匹配另一个右值或左值并没有错!相对于右值评估表达式的技术是一种技巧,在MISRA-C标准中通常将其作为一种安全的编程实践来说明,并且已经多次有用,可以捕获隐秘的错字。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.