当前位置: 首页 > 知识库问答 >
问题:

在一个语句中访问两个挥发物在较新的C中是合法的吗?

印宏阔
2023-03-14

我使用RL78(v.1.40.6)的IAR编译器遇到“未定义行为”警告,代码如下:

static volatile int x[2] = {1, 2};
int test(){
    return x[0]+x[1];
}

警告[Pa082]:未定义的行为:在此语句C:\sandbox\test.c 32中未定义易失性访问的顺序

编译器技术注释提供了一个解释,归结为两个副作用(易失性访问)未排序。

但是,我可以看到上面的代码对于像GCC8这样的较新的编译器是没有问题的。有人能给我指出标准的变化,它使得在一个语句中访问两个易变变量是合法的吗?

共有1个答案

关正雅
2023-03-14

在同一语句中访问两个volatile变量并不非法,但由于标准没有指定+运算符的操作数的求值顺序,因此语言不保证访问的特定顺序,因此x[0]后跟x[1]x[1]后跟x[0]是同样正确的,编译器可以选择其中任何一个。由于这可能不是用户所期望的,因此IAR编译器会发出警告。

 类似资料:
  • 本文向大家介绍在C语言中比较两个字符串是否相等的方法,包括了在C语言中比较两个字符串是否相等的方法的使用技巧和注意事项,需要的朋友参考一下 C语言strcmp()函数:比较字符串(区分大小写) 头文件:#include <string.h> strcmp() 用来比较字符串(区分大小写),其原型为: 【参数】s1, s2 为需要比较的两个字符串。 字符串大小的比较是以ASCII 码表上的顺序来决定

  • 我试着比较两个值 我得到一个错误

  • 我正在检查变量“auth”是否设置在\u POST或\u GET上,并需要两个不同的操作。我已经设法让它与if/else一起工作了,但它看起来很丑陋,很浪费? 如果未设置POST,请选中GET。如果设置了GET,则不执行任何操作 这里有一种全新的方法吗?像检查两者一样,如果两者都没有设置,则转到重定向,如果设置了一个,则继续页面? ^如果这些是可以接受的陈述,“什么都不做”部分应该是什么?

  • 我应该编写一个函数来合并(将一个放在另一个的末尾)两个单独链接的列表。用户向控制台输入一系列数字,例如:1 2 3 4 0(0表示输入结束,不是列表中的元素)。这些数字被放入链表中,链表现在看起来是这样的:1 2 3 4。这个过程再次重复,直到我们有两个不同的链表。然后,合并函数被称为“void merge(结构节点头1,结构节点头2)”。打印新列表后,程序结束。 我的想法是首先将指针指向第一个列

  • 问题内容: 我尝试过查找,尽管其他人也提出了此要求,但他们的情况适用于不同的事物(据我所知)。 我正在学习Java,并且正在创建一个与用户“交谈”,询问问题和问题的程序。作为实际学习面向对象程序设计概念的步骤,我创建了一个类,该类可以帮助我的主项目不充满问题的处理,相反,我将大多数问题的处理和返回放在名为ConversationHelper的类中。 我在ConversationHelper中创建了

  • 问题内容: 我基本上有两个名为和的表。该表具有以下字段: 是表中字段的外键,其中包含以下字段: 我正在运行这样的查询: 除其他事项外,这将返回用户的。但是我想返回用户的用户名,而不是他们的u_id。因此,基本上,在该SELECT语句中,我还想运行: 我可以为此使用两个查询,但是我试图减少我的应用程序运行的查询,而且我知道有一种方法可以将其组合成一个查询,但是我只是不知道:< 有人知道答案吗?谢谢!