相关疑难解决方法(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万
查看次数

运算符优先级与评估顺序

术语"运算符优先级"和"评估顺序"是编程中非常常用的术语,对于程序员来说非常重要.而且,据我所知,这两个概念紧密相连; 在谈论表达时,一个人离不开另一个人.

我们举一个简单的例子:

int a=1;  // Line 1
a = a++ + ++a;  // Line 2
printf("%d",a);  // Line 3
Run Code Online (Sandbox Code Playgroud)

现在,很明显会Line 2导致未定义的行为,因为C和C++中的序列点包括:

  1. 在评估&&(逻辑AND)的左右操作数之间,|| (逻辑OR)和逗号运算符.例如,在表达式中*p++ != 0 && *q++ != 0,子表达式的所有副作用 *p++ != 0都在任何访问尝试之前完成q.

  2. 在评估三元"问号"运算符的第一个操作数和第二个或第三个操作数之间.例如,在表达式中,在第a = (*p++) ? (*p++) : 0一个之后存在一个序列点*p++,这意味着它已经在第二个实例执行时增加了.

  3. 在完整表达结束时.此类别包括表达式语句(例如赋值 a=b;),return语句,if,switch,while或do-while语句的控制表达式,以及for语句中的所有三个表达式.

  4. 在函数调用中输入函数之前.未指定参数的计算顺序,但此序列点表示在输入函数之前所有副作用都已完成.在表达式中f(i++) + g(j++) + h(k++), f使用原始值的参数调用i,但i在进入正文之前递增f.同样,jk正在进入前更新gh 分别.然而,不指定以何种顺序f() …

c c++ operator-precedence

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

为什么a =(b ++)与a = b ++具有相同的行为?

我在C中编写了一个小型测试应用程序,并在我的Ubuntu 14.04上预装了GCC 4.8.4.我感到困惑的是,表达式的a=(b++);行为方式与此相同a=b++;.使用以下简单代码:

#include <stdint.h>
#include <stdio.h>

int main(int argc, char* argv[]){
    uint8_t a1, a2, b1=10, b2=10;
    a1=(b1++);
    a2=b2++;

    printf("a1=%u, a2=%u, b1=%u, b2=%u.\n", a1, a2, b1, b2);

}
Run Code Online (Sandbox Code Playgroud)

gcc编译后的结果是a1=a2=10,而b1=b2=11.但是,我希望括号b1在赋值之前增加a1.

也就是说,a1应该是11a2平等10.

有没有人对这个问题有所了解?

c gcc

18
推荐指数
5
解决办法
2842
查看次数