什么是"序列点"?
未定义的行为和序列点之间的关系是什么?
我经常使用有趣和复杂的表达方式a[++i] = i;,让自己感觉更好.我为什么要停止使用它们?
如果您已阅读此内容,请务必访问后续问题重新加载未定义的行为和序列点.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
为什么这个程序打印"分叉!"4次?
#include <stdio.h>
#include <unistd.h>
int main(void) {
fork() && (fork() || fork());
printf("forked!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我看到了这段代码:
if (cond) {
perror("an error occurred"), exit(1);
}
Run Code Online (Sandbox Code Playgroud)
为什么要这么做?为什么不呢:
if (cond) {
perror("an error occurred");
exit(1);
}
Run Code Online (Sandbox Code Playgroud) With reference to Comma-Separated return arguments in C function [duplicate] ,
x=x+2,x+1;
Run Code Online (Sandbox Code Playgroud)
will be evaluated as
x=x+2;
Run Code Online (Sandbox Code Playgroud)
However, in case of the following code
#include<stdlib.h>
#include<stdio.h>
int fun(int x)
{
return (x=x+2,x+1); //[A]
}
int main()
{
int x=5;
x=fun(x);
printf("%d",x); // Output is 8
}
Run Code Online (Sandbox Code Playgroud)
Shouldn't line [A],be evaluated as
x=x+2;
Run Code Online (Sandbox Code Playgroud)
giving x = 7
拿这三个C代码片段:
1) a = b + a++
2) a = b + a; a++
3) a = b + a, a++
Run Code Online (Sandbox Code Playgroud)
每个人都知道示例1是非常糟糕的事情,并且明确地调用未定义的行为.例2没有问题.我的问题是关于示例3.逗号运算符在这种表达式中是否像分号一样工作?2和3是等价还是3和1一样未定义?
具体来说,我正在考虑这个问题free(foo), foo = bar.这基本上与上述问题相同.我可以确定foo在重新分配之前被释放,或者这是一个明确的序列点问题吗?
我知道这两个例子都是毫无意义的,只使用分号并完成它就更有意义了.我只是出于好奇而问.
代码段是:
int main()
{
int a = 1, b = 2, c = 3;
printf("%d", a += (a += 3, 5, a));
}
Run Code Online (Sandbox Code Playgroud)
虽然它在终端中显示8作为输出.但我没有得到它背后的概念.
考虑一下声明:
int a;
a = 1,2,3;
cout<<a; // prints a = 1
Run Code Online (Sandbox Code Playgroud)
我咨询了这个网站.现在发生这种情况是因为comma运算符的优先级最低.所以它就像(a=1),2,3.但出于好奇,我想知道在此之后发生了什么,编译器是否忘记了剩下的数字2和3.因为我认为如果他们被考虑那么可能先是1然后是2然后3将被初始化为a(类似于a = (1,2,3)).请告诉我这里究竟发生了什么?
c ×6
c++ ×4
comma ×2
c++-faq ×1
coding-style ×1
dictionary ×1
fork ×1
hash ×1
linux ×1
operators ×1
python ×1
python-2.7 ×1
return-value ×1
unix ×1