相关疑难解决方法(0)

未定义的行为和序列点

什么是"序列点"?

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

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

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

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

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

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

cout <<打印函数的调用顺序?

以下代码:

myQueue.enqueue('a');
myQueue.enqueue('b');
cout << myQueue.dequeue() << myQueue.dequeue();
Run Code Online (Sandbox Code Playgroud)

将"ba"打印到控制台

而:

myQueue.enqueue('a');
myQueue.enqueue('b');
cout << myQueue.dequeue();
cout << myQueue.dequeue();
Run Code Online (Sandbox Code Playgroud)

打印"ab"为什么会这样?

似乎cout首先调用最外层(最接近;)函数并且正在进行中,它的行为方式是什么?

c++ cout

27
推荐指数
3
解决办法
3895
查看次数

VS2008中具有优化的"<<"和"++"的运算符优先级

我遇到了一个奇怪的VS2008 C++问题,看起来运算符优先级不受尊重.

我的问题是这个的输出是什么:

int i = 0;  
std::cout << ((i != 0) ? "Not zero " : "zero ") << ++i << std::endl;  
Run Code Online (Sandbox Code Playgroud)

通常++优先于<<,对吧?或者被<<认为是一个函数调用,它的优先级高于++?100%正确的标准答案是什么?

为了检查,我创建了一个新的空项目(VS2008控制台应用程序),只在主要粘贴此代码,结果如下:

Debug|Win32: “zero 1”  
Release|Win32: “zero 1”  
Debug|x64: “zero 1”  
Release|x64: “Not zero 1”
Run Code Online (Sandbox Code Playgroud)

顺便说一句,以下示例产生完全相同的结果:

i = 0;  
printf("%s %d\n", ((i != 0) ? "Not zero" : "zero"), ++i);  
Run Code Online (Sandbox Code Playgroud)

并且在发布中更改优化类型也没有效果,但禁用优化会像其他配置一样输出"零1".

c++ 64-bit winapi operator-precedence visual-studio-2008

8
推荐指数
1
解决办法
245
查看次数