相关疑难解决方法(0)

为什么这些构造使用前后增量未定义的行为?

#include <stdio.h>

int main(void)
{
   int i = 0;
   i = i++ + ++i;
   printf("%d\n", i); // 3

   i = 1;
   i = (i++);
   printf("%d\n", i); // 2 Should be 1, no ?

   volatile int u = 0;
   u = u++ + ++u;
   printf("%d\n", u); // 1

   u = 1;
   u = (u++);
   printf("%d\n", u); // 2 Should also be one, no ?

   register int v = 0;
   v = v++ + ++v;
   printf("%d\n", v); // 3 (Should be the …
Run Code Online (Sandbox Code Playgroud)

c increment operator-precedence undefined-behavior sequence-points

793
推荐指数
13
解决办法
7万
查看次数

508
推荐指数
8
解决办法
5万
查看次数

运算符优先级与计算顺序

一位朋友让我简单地解释一下运算符优先级和求值顺序之间的区别。我是这样向他们解释的:-

让我们举个例子——

int x;
int a = 2;
int b = 5;
int c = 6;
int d = 4;

x = a * b / (c + d);
Run Code Online (Sandbox Code Playgroud)

在这里, 的最终值x将变为1c这是因为,首先将和 的值d相加( ),然后将和6+4的值相乘(),最后进行除法(),最终值变为,然后将其赋值到。ab2*510/101x

所有这些都是由运算符优先级指定的。在此示例中,括号强制加法在乘法和除法之前进行,即使加法的优先级较低。另外,乘法是在除法之前执行的,因为乘法和除法具有相同的优先级,并且两者都具有从左到右的结合性。

现在到了重要的部分,即该表达式的求值顺序。

在一个系统上,求值的顺序可能是这样的 -

/* Step 1 */   x = a * b / (c + d);
/* Step 2 */   x = a * 5 / (c + d);
/* …
Run Code Online (Sandbox Code Playgroud)

c expression-evaluation operator-precedence

5
推荐指数
1
解决办法
1255
查看次数

i = x[i]++ 吗?导致未定义的行为?

有人可以解释一下是否i = x[i]++;会导致未定义的行为吗?

\n

注意:x[i]i并不都是易失性的且不x[i]重叠i

\n

有 C11,6.5 表达式,2(添加强调):

\n
\n

如果标量对象上的副作用相对于同一标量对象的不同副作用使用同一标量对象的值的值计算而言是无序的,则该行为是未定义的。如果表达式的子表达式有多个允许的\n排序,并且在任何排序中出现这种未排序的副作用,则行为是未定义的。84)

\n
\n

我认为:

\n
    \n
  • 不存在“同一标量对象上的不同副作用”
  • \n
  • 不存在“使用同一标量对象的值进行值计算”
  • \n
\n

是否有“多重允许的订购”?

\n

总体而言:如何i = x[i]++;解释序列点、副作用和未定义的行为(如果有)?

\n
\n

UPD。结论:会i = x[i]++;导致 2 个副作用:

\n
    \n
  1. “操作数对象的值递增”(后缀递增)
  2. \n
  3. “更新左操作数的存储值”(赋值运算符)
  4. \n
\n

该标准没有定义副作用发生的顺序。

\n

因此,根据 C11,4. 一致性,2:

\n
\n

未定义的行为在本国际标准中另外通过文字 \xe2\x80\x98\xe2\x80\x98undefinedbehavior\xe2\x80\x99\xe2\x80\x99 或通过省略任何明确的行为定义来表示。

\n
\n

实验表明,GCC/LLVM/ICC 有序1-2,而 …

c arrays undefined-behavior language-lawyer post-increment

5
推荐指数
1
解决办法
201
查看次数

C 与 Java 中的表达式计算

int y=3;
int z=(--y) + (y=10);
Run Code Online (Sandbox Code Playgroud)

当在 C 语言中执行时, 的值z计算为 20,但当在 java 中执行相同的表达式时,执行时的z值为 12。

谁能解释为什么会发生这种情况以及有什么区别?

c java variables expression operators

0
推荐指数
1
解决办法
115
查看次数