for 循环中可能实现的功能

2022-09-03 04:02:32

所以今天我去面试,其中一个问题是以下(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());
}

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

所以我想我的问题可以归结为这一点。

  1. 是否所有基于 C 语法的语言都实现了此功能?IE:C,C++,Java,javascript等。
  2. 此语法源自何处?
  3. for 循环是否可以采用任何其他“不为人知”的结构?
  4. 鉴于阅读起来有多难,像上面这样的代码被认为是不好的做法吗?
  5. 有没有需要这种结构的好的现实世界的例子?

答案 1
for (statement1; statement2; statement3)
{
     /* body */
}

(1)首先执行。statement1

(2) 执行下一步。statement2

(3)如果评估为真,则执行主体statement2

(4)然后执行。statement3

(5) 从步骤(2)重复上述步骤

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

您显示的结构与上面相同的正常结构。可以是任何语句。在您的示例中,您用逗号运算符分隔了 和 。可以用逗号运算符分隔任意数量的语句。statement nstatement1statement3

通常,循环与 with 初始化一起使用,因为它只执行一次。用于循环终止条件检查,因为此语句的计算值用于决定是否进入突破的主体。和 用于更新循环终止变量,因为它在主体之后执行。但一般来说,它们可以以任何方式使用。forstatement1statement2statement3

首先是初始化变量。接下来是 如果这是真的,那么正文就被执行了。在执行正文之后,即执行。该循环将迭代时间到 。但是将打印时间,就像在某一点上一样,并且将变得相同,并且将评估为假。statement1i=10, j=0;statement2j <= 10statement3i--,j++110105ijif (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");

我们应该始终尝试编写易于阅读且不会造成混淆的代码。这有助于代码编写者以及阅读代码的其他人。


答案 2
  1. Java 和 C# 都共享相同的语法
  2. 语法可能源于C / C++它是Java和C的“根”#
  3. 是的,for 循环也可以有零初始值设定项和结束条件。
  4. 这是否是不良做法实际上取决于如何使用它。您可以使用这种技术创建非常隐晦的代码,但是,这并不意味着如果使用得当,它是完全可以接受的。
  5. 我怀疑!

推荐