使用++运算符会导致意外的结果
Using ++ operator leads to unexpected results
我不明白为什么下面的两个代码会导致相同的结果。后一个不是应该从6打印到10吗?因为n首先递增?
编辑:我使用了Visual Studio 2019和repl.it.
#include <iostream>
using namespace std;
int main() {
int n=5;
for (n; n<10; n++)
cout << n << endl;
return 0;
}
>>> 5
6
7
8
9
#include <iostream>
using namespace std;
int main() {
int n=5;
for (n; n<10; ++n)
cout << n << endl;
return 0;
}
>>> 5
6
7
8
9
来源https://en.cppreference.com/w/cpp/language/for
attr(可选(for(init语句条件(可选(;迭代表达式(可选((语句
上述语法生成的代码等效于:
{
init_statement
while ( condition ) {
statement
iteration_expression ;
}
}
因此,您的两个for循环等效于
{
n;
while (n < 10) {
cout << n << endl;
n++;
}
}
和
{
n;
while (n < 10) {
cout << n << endl;
++n;
}
}
在for循环中:
- 第一条语句只执行一次
- 检查条件,如果为true
- 尸体被处决
- 然后执行迭代表达式
- 后藤(2.(
如果你想让循环从6开始,你需要明确地告诉它从6开始。
这里没有错,只是它应该如何工作
首先,你应该知道for循环的工作原理对于循环,在不损失通用性的情况下,可以写成:
for(exp1; exp2; exp3)
{
//body
}
这里exp1将只在第一次进入循环时执行,然后exp2将被求值,如果true循环将继续,否则将不执行。exp3仅在每次迭代完成后进行评估。
i++和++i之间的唯一区别是,当你把它分配给某个东西时。假设我是5,然后在陈述之后
i++;
我6岁这也适用于以下语句:
++i;
但是假设i=5,但你可以试试这样的东西:
a=i++;
在这个陈述之后,a将是5,而我将是6。
但在这句话之后,在相同的初始条件下(i=5(:
a=++i;
a和我都6岁了。
唯一的区别是:
for (n; n<10; n++)
与。这个:
for (n; n<10; ++n)
for
语句中的第一个和第三个表达式仅针对其副作用进行评估,并丢弃任何结果。(第二个是评估的,其结果用于确定是否继续循环。(n++
和++n
之间的唯一区别是它们的结果;它们的副作用是相同的。因此在此上下文中n++
和++n
实际上是相同的。
我还将提到第一个表达式n
没有副作用,所以它可能会被省略:
for (; n<10; n++)
或者,更好的是,您可以将声明和初始化合并到循环中,替换现有的声明int n=5;
:
for (int n = 5; n < 10; n++)
相关文章:
- 尝试将字符串/字符转换为整数会产生意外结果
- RapidXML - 代码创建意外结果
- 类中静态函数C++意外结果
- 指针数组中的意外结果
- 使用指针访问数组元素时出现意外结果
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- C++:比较运算符>和字符串文本的意外结果
- 具有意外结果的 C++ 闭包
- yaml-cpp 比较的意外结果
- 每次都出现意外结果
- 在 Qt 中解析嵌套的 JSON 时出现意外结果(数组不存在)
- 如何避免 std::abs 的意外结果?
- 使用嵌套 if 语句的意外结果
- A ^= B ^= A ^= B;C# Visual Studio 中的意外结果
- 逻辑错误,我将获得意外结果
- 在 c++ 中使用异步的意外结果
- 从函数的返回值将元素C++存储到 std::vector 中时出现意外结果
- 执行递增和递减时"cout"链接会产生意外结果
- OpenCL - 内核方法返回意外结果
- C++使用 std::get_time 解析 YYMMDD ISO 8601 日期字符串会得到意外结果