c#语法问题 - for循环和行尾

时间:2010-12-06 12:52:42

标签: c#

我目前正在学习c#并阅读几本书。我可以做很多事情,但是只能通过修改示例 - 真的让我感到沮丧,因为我实际上并不了解一些更基本的项目是如何工作的。

我刚刚完成了一个控制台应用程序,它接受参数并逐个显示它们。

代码是:

using System;

class test
{ static int Main(string[] argsin)
{ 

for (
        int i = 0; 
        i < argsin.Length; 
        i++
    )
Console.WriteLine("Argument: {0}", argsin[i]);
Console.ReadLine();
return -1;
}
}

现在,这非常有效,但是来自Visual Basic的基本(没有双关语)理解,如何/为什么知道打印正确的参数然后在第一个{而不退出应用程序之后继续下一个{ {1}} ......我觉得我已经错过了这个工作原理的基础知识!

接下来,为什么在for循环中,每一行都以Console.WriteLine之外的分号结尾?

我一直忘记不时添加它,然后在试图解决它为什么没有编译时,我添加了一个我不想要的地方!

9 个答案:

答案 0 :(得分:7)

您的代码格式有点奇怪,如果您重新格式化,我认为它更容易理解:

using System;

class test
{ 
    static int Main(string[] argsin)
    { 
        for (int i = 0; i < argsin.Length; i++)
        {
            Console.WriteLine("Argument: {0}", argsin[i]);  
        }
        Console.ReadLine();
        return -1;
    }
}

因为你可以看到int i = 0; i < argsin.Length; i++不是3个不同的行,它们都只是for循环的参数。

添加{}可以更轻松地查看for循环中的代码行。

答案 1 :(得分:4)

我将尝试通过与VB语法进行比较来解释循环。

在C#中:for (int i = 0; i < 5; i++)

在VB中:For i = 0 To 4

i = 0部分在两者中是相同的,所以我想很明显 - 这用于初始化循环迭代器。

C#中的i < 5部分在VB中成为0 to 4 ....你可以把它想象成VB正在做一个“快捷方式”,但两者的含义是相同的:那就是循环条件,即循环将继续运行的条件是什么,在这种情况下,只要i小于5,循环就会继续运行。

最后,C#中需要的i++部分告诉“每次迭代后迭代器会发生什么?”好的旧友好VB中不需要它,只需为你增加1,总是 - 默认情况下。

为什么在循环的每个部分后都有分号?因为每个部分都有自己的含义和用法,所以编译器必须知道在构建最终代码时如何分离部分。为什么在i++部分之后没有分号?在最后一个参数传递给函数之后没有逗号的原因相同,例如Console.WriteLine("Argument: {0}", argsin[i], );

关于没有“阻止”只有一行的循环,在其他答案中有解释,经验法则是C#允许单行块没有括号。

答案 2 :(得分:3)

按惯例c#和所有c类语言在提供for循环(或if语句等)时会立即运行该行。我个人不喜欢这样写代码,我觉得它缺乏可读性。

为了澄清我们可以添加花括号来表示范围

for (
        int i = 0; 
        i < argsin.Length; 
        i++
    )
{
     Console.WriteLine("Argument: {0}", argsin[i]);
}
Console.ReadLine();
return -1;

现在for循环执行的内容是明确定义的(如果我们想在循环中做更多的操作,我们会在花括号之间添加额外的指令。)

编辑: 定义for循环时半冒号的原因是该定义的每个部分都是一个单独的语句。

int i = 0; //creates an integer i and sets its value to 0
i < argsin.Length; sets our comparison operation to define when the loop ends
i++ //what to do at the end in this case increment i by 1

每个都需要独立于其他处理,并且半冒号表示c#中语句的结尾(这就是为什么每一行以其结尾)我们使用它来分解语句,以便编译器可以读取它。

虽然2个分号是强制性的,但如果我们想要改变它,我们就不能这样做。

int i = 0;
for (;;)
{
     if(i>=argsin.Length){
         break;
     }
     Console.WriteLine("Argument: {0}", argsin[i]);
     i++;
}

这在功能上与你编写它的方式完全相同但是我已经将for语句中的所有逻辑移到了它内部的等效位置(或者在定义i的情况下是外部)循环

答案 3 :(得分:2)

应用程序打印正确数量的参数的原因是WriteLine语句是循环的一部分。在C#中,如果在for语句之后只有一行代码,则不需要大括号。 (if也是如此)

所以

for (int i = 0; i < argsin.Length; i++)
    Console.WriteLine("Argument: {0}", argsin[i]);

相同
for (int i = 0; i < argsin.Length; i++)
{
    Console.WriteLine("Argument: {0}", argsin[i]);
}

正如i++之后的分号那样。通常,for语句写在一行上,就像我在上面的示例中所做的那样。

希望这有帮助。

答案 4 :(得分:1)

我将您的格式略微提升了一些,这让您更容易理解它的工作原理。

using System;

class test
{
    static int Main(string[] argsin)
    { 

        for (int i = 0; i < argsin.Length; i++ )
            Console.WriteLine("Argument: {0}", argsin[i]);

        Console.ReadLine();
        return -1;
    }
}

对于类似C的语言有一个特殊规则:您使用类似于if(true) { ... }的{​​{1}}定义其范围,但如果您只有一行,则可以决定使用括号。因此,If True Then ... End Ifif之后的下一行将用于范围。

for[each]并不以i++结尾,因为它位于;的声明范围内。

另外,不要忘记查看for循环。

答案 5 :(得分:1)

如果我用不同的格式(但语法相同)重写你的方法,它可能会使事情变得更清楚:

static int Main(string[] argsin)
{ 
    for (int i = 0; i < argsin.Length; i++)
    {
        Console.WriteLine("Argument: {0}", argsin[i]);
    }

    Console.ReadLine();
    return -1;
}

请记住,c#不使用换行符来终止语句(与VB不同)。 “for”循环中的“第三行”实际上并不是“行”,它只是第三个表达式,并由结束括号终止。

循环继续而不是退出的原因是(没有用于指示语句块的粗略括号)'for'循环将仅在循环之后立即循环单个语句 - 即'Console.WriteLine'。我猜你认为'ReadLine'和'return'语句是循环的一部分,但是在C#语法中,情况并非如此。 (我将bracess添加到我的版本中以使循环的范围更清晰。)

答案 6 :(得分:1)

我会回答你问题的一部分......

for是一个具有初始化器,循环语句和终止条件的构造。

所以

for (X, Y, Z) { }

等同于

X;
while (Y)
{
//   code
    Z;
}

关于不退出应用程序的问题 - for ()将绑定到第一个NEXT语句或语句BLOCK。在您的情况下,您只有一行作为声明。如果有更多行,则应将其写入{}

答案 7 :(得分:1)

for循环的典型语法是:

for( int i = 0; i < argsin.Length; i++ )
{
    //<CODE>
}

所以你(在你的脑海里)读到它:“临时值'i'从值0开始,而'i'小于'argsin.Length',做'// {{1 }}

' with i as the value, always ending with 'i++'"


A for loop just gets translated to:

(额外的周围括号是说'我'超出范围,当括号关闭时不能再使用)。与任何'if'或'while'语句一样,右括号提供'end-of-statement'“Character”(如果你愿意),因此分号是不必要的。之前它们是必须的,因为你必须知道在哪里结束每个陈述。

<强> [编辑]

顺便说一下:除了直接翻译之外还有一点点。在某些情况下,您可以包含多个初始化,以及多个“在每个循环结束时”的指令。在你明白发生了什么之前不要担心这些。

答案 8 :(得分:0)

这是for循环的基础,在该循环中,你声明整数i的起始值为零,它应该继续循环,直到i等于string [] argsin的长度并增加我每次迭代。这意味着如果argsin数组的长度为5,则循环将

// first run
for(int i = 0;i<5;i++)
Console.WriteLine("Argument: {0}",argsin[0]);

// second run
for(int i = 1;i<5;i++)
Console.WriteLine("Argument: {0}",argsin[1]);

// third run
for(int i = 2;i<5;i++)
Console.WriteLine("Argument: {0}",argsin[2]);

// forth run
for(int i = 3;i<5;i++)
Console.WriteLine("Argument: {0}",argsin[3]);

// fifth run
for(int i = 4;i<5;i++)
Console.WriteLine("Argument: {0}",argsin[4]);

在5次运行之后,我将是5并且不会遇到5 < 5并退出此循环并继续下一个声明。