标签: sequence-points

关于序列点的后增量

post增量运算符何时影响增量?我遇到了两个意见:

1)来自http://gd.tuwien.ac.at/languages/c/programming-bbrown/c_015.htm:

POST表示在任何赋值操作后执行操作.

2)言归正传,关于SO回答(虽然在C++上)说:

...将增量延迟到表达式结束(下一个序列点).

后增量操作也是如此......

A)等到达到序列点或

B)发布任务运营商或

C)在序列点之前的任何时间发生?

c sequence-points post-increment

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

在不使用C中的第三个变量的情况下交换两个变量的值?

我找到了以下代码片段:

#include <stdio.h>

int main(void) {
    int x=10,y=15;
    x=x+y-(y=x);
    printf("x=%d y=%d",x,y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它实际上交换了变量

任何人都可以解释一下代码如何交换变量?

我认为括号将首先执行然后表达式导致

x=x+y-y;
Run Code Online (Sandbox Code Playgroud)

c expression operator-precedence sequence-points

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

为什么此代码中没有违反序列点规则的情况?

使用的编译器:gcc 8.2

命令行:-Wall

我目前对序列点违规的理解是代码在某种程度上取决于给定表达式中操作数/子表达式的求值顺序。之所以如此,是因为表达式中操作数的求值顺序未指定,如此处所述。因此,代码如下:

a = 5;
b = a + ++a;
Run Code Online (Sandbox Code Playgroud)

是一种违规并被-Wsequence-point捕获,因为结果存在歧义,即应该是 (5 + 6) 还是 (6 + 6) ?我认为下面的代码中存在类似的歧义,因为我们无法知道第二个 ++a 是否会在第一个之前被评估:

#define MIN(a, b) (((a) < (b)) ? (a) : (b))

int use() 
{ 
    int min;
    int a = 4, b = 5;
    min = MIN(++a, b);
    //min = ((++a) < b) ? (++a) : b;
    return min;
}
Run Code Online (Sandbox Code Playgroud)

我显然错过了一些东西,因为这段代码没有在-Wseqeuence-point上警告我。有人可以帮我理解什么吗?请注意,我特意按原样定义了 MIN。

c compiler-warnings sequence-points

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

此 C 代码会导致未定义行为吗?

我知道:

int b = 1, c = 2, d = 3, e = 4;
printf("%d %d %d", ++b, b, b++);
Run Code Online (Sandbox Code Playgroud)

导致未定义的行为。自从

在两个序列点之间多次修改任何对象是 UB。 未定义的行为和序列点

但我不知道是否:

int b = 1, c = 2, d = 3, e = 4;
printf("%d", b++ + ++c - --d - e--);
Run Code Online (Sandbox Code Playgroud)

也是UB吗?

我认为递增/递减运算符将首先评估,因为它们之间的优先级从右到左,因为 associativity 。然后算术运算符将从左到右计算。

这将是

(b) + (c + 1) - (d - 1) - (e)

即 1 + (2 + 1) - (3 - 1) - (4)

= (2 - 4)

= -2 …

c operator-precedence undefined-behavior sequence-points

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

使用比较变量作为参数解释printf

main(){
    int a = 5;
    int b = 6;
    printf("%d %d %d",a==b,a=b,a<b);
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中输出

1 6 1

在上面的程序中,我期望输出为0 6 0.在一些编译器中,它给出了这个输出(例如Xcode),但在某些其他编译器中,它输出为1 6 1.我找不到解释.这也是序列点的情况.

考虑以下计划

main(){
    int a = 5;
    int b = 6;
    printf("%d %d %d",a<b,a>b,a=b);
    printf("%d %d",a<=b,a!=b);
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中输出

0 0 6 1 0

这个下面的程序正在给出正确的输出,我期待的是0 0 6 1 0但是为什么上面的程序在大多数编译器中没有给出输出060

c undefined-behavior sequence-points

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