什么可能在for循环中

Max*_*ich 16 c c# java loops for-loop

所以今天我去了一个面试,其中一个问题是以下(C#背景).

//Print the output for the following code:
for (int i = 10, j = 0; j <= 10; j++, i--)
{
    if (i > j)
        Console.WriteLine(j.ToString());
}
Run Code Online (Sandbox Code Playgroud)

我以前从未见过这样的结构,并且问过我的同事,我工作场所的5个人中有4个也不知道(也许更多的是对我们的反思,但我离题了).使用一些基本逻辑,我能够正确回答这个问题,但是这些知识彻底改变了我对如何构造循环的理解.

所以我想我的问题归结为此.

  1. 所有基于C语法的语言都实现了这个功能吗?IE:C,C++,Java,javascript等
  2. 这种语法源于何处?
  3. for循环可以采用其他"不为人知的"结构吗?
  4. 考虑到阅读的难度,编写上面的代码是不是被认为是不好的做法?
  5. 有没有好的现实世界的例子需要这样的结构?

pho*_*xis 25

for (statement1; statement2; statement3)
{
     /* body */
}
Run Code Online (Sandbox Code Playgroud)

(1)首先statement1执行.

(2)statement2执行下一步.

(3)如果评估statement2为真,则执行正文

(4)然后statement3执行.

(5)从步骤(2)开始重复

          |                  +<-----------------+
          |                  |                  ^
          V                  V                  |
 for (  (s1); -------->(s2 true? | false?);    (s3) )
 {                           |       |          ^
                             |       |          |
                             |       |          |
                             V       |          |
                          (body)-----|--------->+
 }                                   |
                                     |
                                     V
                                 (come out)
Run Code Online (Sandbox Code Playgroud)

您显示的结构与上面的结构相同.该statement n可以是任何声明.在您的示例中,您在和中用逗号运算符分隔.您可以用逗号运算符分隔任意数量的语句.statement1statement3

通常,for循环与statement1with初始化一起使用,因为它只执行一次.该statement2用于循环终止条件检查,因为这句话的评估值来决定是否进入破体而出.并且statement3用于更新循环终止变量,因为它在正文之后执行.但通常它们可以以任何方式使用.

首先statement1i=10, j=0;初始化变量.接下来statement2j <= 10如果这是真的那么执行正文.执行体内后,statement3i--,j++被执行.循环将遍历11010.但是,将打印5时间,因为在一个点上i,并j成为同和if (i > j)将评估假.

编辑 这是一个例子,它可以用来检查回文字符串,但不是很实用,而是一个样本用途.

  int i, j, n, flag;
  char str[128];

  printf ("\nEnter string: ");
  scanf ("%s", &str);
  n = strlen (str);


for (flag=1, i=n-1, j=0; j<n/2; j++, i--)
{
  if (str[i] != str[j])
  {
    flag = 0;
    break;
  }
}

if (flag)
 printf ("\n\"%s\" is a palindrome");
else
 printf ("\n\"%s\" is not a palindrome");
Run Code Online (Sandbox Code Playgroud)

我们应该总是尝试编写易于阅读且不会产生混淆的代码.这有助于代码编写者以及其他阅读代码的人.


Col*_*inE 10

  1. Java和C#都使用相同的语法
  2. 语法可能源于C/C++,它是Java和C#的"根"
  3. 是的,您的for循环也可能没有初始化器和结束条件.
  4. 是否是不好的做法实际上取决于它的使用方式.你可以使用这种技术创建非常神秘的代码,但是,这并不意味着正确使用它是完全可以接受的.
  5. 我对此表示怀疑!

  • 嗯?尽管Maxim和他的同事都非常尊重,但他们却一无所知.现在他们已经看到了,他们不再难以理解它,那么这是否意味着它不再是不好的做法?我知道使用即使你知道它们也难以阅读的结构有点不好,但我不认为for循环中的逗号就是其中之一.我宁愿避免这种做法而不是让你的同事学习这门语言似乎是错误的. (3认同)