序列点和运算符优先级之间的区别是什么?0_o

27 浏览
0 Comments

序列点和运算符优先级之间的区别是什么?0_o

让我举个例子:\na = ++a;\n上述语句被称为具有未定义行为(我已经阅读了关于未定义行为的文章),\n但是根据优先级规则,前缀运算符++的优先级高于赋值运算符=,\n所以a应该先递增,然后再赋值回给a。所以每个评估都是已知的,那为什么会是未定义行为呢?

0
0 Comments

在上述内容中,提到了一个关于为什么会出现UB的问题。原因是在一个序列点之前尝试两次更改变量a的值:

  • ++a
  • operator=

虽然我已经知道了这个问题,但是序列点和运算符优先级有什么区别呢?为什么在这里他们是错误的呢?

无论首先做什么,如果它引起了未定义的行为,那就没有关系。

0
0 Comments

序列点和运算符优先级之间的区别是因为解析表达式的语法规则导致的。事实上,++=优先级更高只意味着++与其操作数的绑定比=更紧密。实际上,在您的示例中,由于运算符出现的顺序,只有一种解析表达式的方式。在a = b++这样的示例中,语法规则或优先级保证这意味着与a = (b++)相同,而不是(a = b)++

优先级与表达式的求值顺序或表达式副作用的应用顺序几乎没有关系。(显然,如果运算符根据语法规则(或优先级)对另一个表达式进行操作,则必须在应用运算符之前计算该表达式的值,但大多数独立的子表达式可以以任何顺序计算,并且副作用也可以以任何顺序处理。)

0
0 Comments

在程序中,运算符不仅可以产生值,还可以具有副作用。例如,++a可以产生(a + 1)的值,但也会对a进行递增操作。同样,a = 5可以产生5的值,并将a的值设置为5。因此,在这里你有两个副作用,这两个副作用都发生在序列点之间(可见的分号和前一条语句的结束)。尽管由于运算符优先级的原因,这两个运算符的计算顺序是明确定义的,但是它们的副作用处理顺序仍然是未定义的。这就是出现未定义行为的原因。

解决这个问题的方法是,确保在两个副作用之间有一个序列点或者在副作用之间进行适当的同步。这可以通过在副作用之间添加一个序列点,例如使用逗号运算符,或者使用同步机制(例如互斥锁或原子操作)来实现。

,运算符可以产生值,同时也可以具有副作用。当多个副作用发生在序列点之间时,副作用的处理顺序是未定义的,从而导致未定义行为。为了解决这个问题,可以通过添加序列点或使用同步机制来确保副作用的顺序性和可预测性。

0