相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

未定义的行为和序列点之间的关系是什么?

我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?

如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ c++-faq undefined-behavior sequence-points

970
推荐指数
4
解决办法
10万
查看次数

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

#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万
查看次数

是printf的输出("%d%d",c ++,c); 也未定义?

我最近发现了一篇帖子cout << c ++ << c ;?的正确答案是什么?并且想知道是否输出

int c = 0;  
printf ("%d %d", c++, c);  
Run Code Online (Sandbox Code Playgroud)

还未定义?

我已经在讲座中研究了修复后和前缀运算符只有在得到分号后才增加值.所以据我说,输出0 0是正确的!

c undefined-behavior

20
推荐指数
2
解决办法
5222
查看次数

函数调用的序列点?

这是另一个序列点问题,但是一个相当简单的问题:

#include <stdio.h>
void f(int p, int) {
  printf("p: %d\n", p);
}

int g(int* p) {
  *p = 42;
  return 0;
}

int main() {
  int p = 0;
  f(p, g(&p));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为吗?或者调用g(&p)充当序列点?

c c++ undefined-behavior sequence-points

7
推荐指数
1
解决办法
748
查看次数

请解释为什么Java和C为此代码提供不同的答案

public class Test
{
    public static void main(String[] args) {
        int i = 10;
        i = i++;
        System.out.println("value of i is : " + i);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是: 10

当我执行类似的代码时C,输出是11.

c java

-2
推荐指数
2
解决办法
401
查看次数