在 c 循环(while 循环)中是否有任何特殊情况,我们必须在变量之前而不是之后使用增量运算符?示例:++N 与 N++

Is there any special case in c loops (while loop) where we must use increment operator before the variable instead of after?? example: ++n against n++

提问人:Marvelous Dele 提问时间:9/20/2023 最后编辑:John KugelmanMarvelous Dele 更新时间:9/20/2023 访问量:122

问:

好的,我正在学习 C 中的 while 和 for 循环,所以我试图编写一个代码,该代码打印 1=0,初始化表达式为 count = 1,测试表达式为 count < 5,更新表达式为 count++

当我使用 count++ 时,我一直得到一个无限循环,但是当我使用 ++count 时,我根据需要在四个地方得到 1=0。

谁能帮我理解。这是我的代码的样子。

#include <stdio.h>

int main() {

int count = 1;

 while (count < 5) {
 count = count++;
 printf("1=0\n");
 }

return 0;
}

在第二种情况下,

#include <stdio.h>

int main() {

int count = 1;

 while (count < 5) {
 count = ++count;
 printf("1=0\n");
 }

 return 0;
 }

我试过这个,一直得到一个无限的 1=0 列表

 #include <stdio.h>

  int main() {

  int count = 1;

  while (count < 5) {
  count = count++;
   printf("1=0\n");
   }

  return 0;
  }

我试过这个,并在四个地方得到了 1=0,正如我预期的那样。

#include <stdio.h>

 int main() {

 int count = 1;

 while (count < 5) {
 count = ++count;
 printf("1=0\n");
 }

return 0;
}
C while 循环

评论

2赞 Eljay 9/20/2023
是的,对于某些语言来说,预增量可能比后增量更有效,因为预增量不需要返回临时值。++xx++
1赞 Lundin 9/20/2023
此外,这是某些语言或语言版本中定义良好的代码,但在 C 中未定义的行为。

答:

3赞 Nate Eldredge 9/20/2023 #1

在 C 中增加变量的正确方法既不是正确的,也不是。事实上,它们会导致未定义的行为。为什么这些构造使用增量前和增量后未定义的行为?count = count++count = ++count

两种形式的运算符都会修改其操作数,因此您只需编写或单独编写即可。两者在程序中的行为应该相同,并且对于大多数编译器,它们的优化也相同。++++count;count++;

1赞 Lundin 9/20/2023 #2

如前所述,在同一表达式中具有两个“未排序”副作用的示例会调用未定义的行为,因此任何一个版本都是 C 中的错误。count

忽略这一点,这实际上是一个很好的问题。因为由于在同一个表达式中将运算符与其他运算符混合时可能存在上述错误,因此有一个合理的、通用的最佳实践规则,即我们永远不应该将运算符与其他运算符混合。(此规则由 MISRA 或 CERT 等编码标准强制执行。++++

假设我们努力遵循最佳实践规则,那么问题就是我们应该如何重写你的循环。 是最明显、最惯用的形式。这里有自己的表达方式,它不会造成任何伤害。当我们将它隔离到它自己的表达式中时,我们可能会注意到,实际上我们是否编写 或 并不重要,它们在这个循环中是 100% 等价的。for(int count=1; count<5; count++)count++++countcount++for

然后我们可能会注意到前缀和后缀是 C 语言中的多余功能。如果我们始终遵循最佳实践,我们就可以避免使用两个不同的递增运算符(以及两个不同的递减运算符)。因此,如果您发现使用前缀或后缀增量很重要,仅此一项就表明您的代码很可疑,应该重写。++

不过,我们应该理解一些编写 C 的“旧惯用”方法,例如通过 实现 strcpy 自己。这是可怕的代码,但可悲的是,它很常见,所以学习前缀和后缀仍然是一个好主意,以防你最终阅读旧的 C 代码或与旧的 C 程序员互动(毫无疑问,他们很快就会冲上去为我刚刚发布的这个可怕的代码辩护)。while(*ptr1++ = *ptr2++);

(值得注意的是,这里的其他语言非常不同。Java 对原始代码有明确定义的顺序。某些版本的 C++ 也是如此 - 其他版本将其作为未定义的行为,如 C。在 C++ 中,由于运算符重载,前缀/后缀确实有点重要。