【问题标题】:Assignment expression in C++ for-loop update expressionC++ for循环更新表达式中的赋值表达式
【发布时间】:2020-07-11 19:02:39
【问题描述】:

根据cppreference.comC++for循环的更新表达式迭代表达式语言可以

任何表达式,在循环的每次迭代之后和重新评估条件之前执行。

因此,我认为以下 for 循环是正确的:

//initializations

Point cursor;
cursor.y = minR * pixelSpacing.y + origin.y;
for (int r = minR; r <= maxR; r++, cursor.y += pixelSpacing.y, cursor.x = minC * pixelSpacing.x + origin.x)
{
    //loop statements
}

但是,我在循环结束时获得的结果与使用以下代码获得的结果不同:

//initializations

Point cursor;
cursor.y = minR * pixelSpacing.y + origin.y;
for (int r = minR; r <= maxR; r++, cursor.y += pixelSpacing.y)
{
    cursor.x = minC * pixelSpacing.x + origin.x;

    //loop statements
}

因此在for循环的更新表达式中使用赋值表达式是无效的吗?

【问题讨论】:

  • 我的意思是 C++,对不起。
  • 除了语句执行的顺序——在循环体之后或之前,这两个示例没有区别。如果循环中的任何内容都依赖于这些变量,那么顺序当然很重要。
  • 什么是“循环语句”?他们是否随时查找cursor.x?还是更新因素之一?如果您查看参考,您会发现它与在循环语句之后 (而不是之前)执行它相同。此外,如果您在循环语句中的任何位置都有continue 命令,它的行为可能与循环结束时的另一个语句不同。是这样吗?
  • 在第一个例子中,赋值是在你的循环语句之后执行的

标签: c++ for-loop iteration variable-assignment


【解决方案1】:

这个

for (int r=minR; r<=maxR; r++, cursor.y += pixelSpacing.y, cursor.x = minC * pixelSpacing.x + origin.x)

等价于:

for (int r=minR; r<=maxR; /* nothing here */)
{
  /* loop body here */

  r++;
  cursor.y += pixelSpacing.y; 
  cursor.x = minC * pixelSpacing.x + origin.x;
}

因此,唯一的区别是执行各种语句的顺序。请注意,逗号运算符从左到右求值,保证最左边的操作数首先被执行。

【讨论】:

  • 除非循环体中有continue ;^)(这里不太可能)
猜你喜欢
  • 2016-05-17
  • 2015-09-23
  • 2016-02-14
  • 2021-10-23
  • 2017-03-12
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多