看完后隐藏功能和C++/STL的暗角上comp.lang.c++.moderated,我完全惊讶的是,下面的代码片断编译并在两个Visual Studio 2008和G ++ 4.4的工作.
这是代码:
#include <stdio.h>
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d ", x);
}
}
Run Code Online (Sandbox Code Playgroud)
我假设这是C,因为它也适用于GCC.标准中定义了哪里,它来自何处?
在C++中迭代向量的正确方法是什么?
考虑这两个代码片段,这个工作正常:
for (unsigned i=0; i < polygon.size(); i++) {
sum += polygon[i];
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
for (int i=0; i < polygon.size(); i++) {
sum += polygon[i];
}
Run Code Online (Sandbox Code Playgroud)
产生warning: comparison between signed and unsigned integer expressions.
我是C++世界的新手,所以unsigned变量对我来说有点可怕,我知道unsigned如果使用不正确,变量会很危险,所以 - 这是正确的吗?
我记得首先在STL中学习矢量,经过一段时间后,我想在我的一个项目中使用bool矢量.在看到一些奇怪的行为并做了一些研究之后,我了解到一个bool矢量并不是真正的bool矢量.
在C++中还有其他常见的陷阱需要避免吗?
我第一次尝试反向for循环 n次做的事情是这样的:
for ( unsigned int i = n-1; i >= 0; i-- ) {
...
}
Run Code Online (Sandbox Code Playgroud)
这是失败的,因为无符号算术 i保证总是大于或等于零,因此循环条件将始终为真.幸运的是,在我不得不想知道为什么循环无限执行之前,gcc编译器警告我"无意义的比较".
我正在寻找一种解决这个问题的优雅方法,请记住:
有任何想法吗?谢谢 :)
我想从头到尾显示我的列表.喜欢:
for (std::list<T>::const_iterator it = list.end(); it != list.begin(); --it)
Run Code Online (Sandbox Code Playgroud)
问题是当它在第一个元素(list.begin())中时它不会进入.我怎样才能做到这一点?
我应该怎么做C++代码中的"签名/无符号不匹配"警告,如下所示:
for (int i = vector.size() - 1; i >= 0; --i) // OK
{
if (i < vector.size() / 2) // warning C4018: '<': signed/unsigned mismatch
// ...
}
Run Code Online (Sandbox Code Playgroud)
(一个人为的例子,但它证明了这个问题.)
如何处理"签名/未签名的不匹配"警告(C4018)?说要size_t用于循环变量,但是这对于终止于0的递减循环不起作用.它在没有警告的情况下编译,但是整数在运行时溢出(或者它是下溢?)并且变为4294967295.
考虑这个for使用 a 的Python循环range:
for i in range(n-2, -1, -1):
Run Code Online (Sandbox Code Playgroud)
随着循环迭代,i采用值n-2, n-3, 直到0。
C++ 中的等效代码是什么?
这个问题几乎是从另一个已删除的问题中逐字复制的。