post增量运算符何时影响增量?我遇到了两个意见:
1)来自http://gd.tuwien.ac.at/languages/c/programming-bbrown/c_015.htm:
POST表示在任何赋值操作后执行操作.
...将增量延迟到表达式结束(下一个序列点).
后增量操作也是如此......
A)等到达到序列点或
B)发布任务运营商或
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) 使用的编译器: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。
我知道:
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 …
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