需要帮助理解代码

时间:2009-05-20 22:26:41

标签: c# arrays

我正在学习C#课程,我需要帮助理解以下代码。

代码有一个数组,表示对调查的响应,值为1到10。

输出显示这些评级以及选择值的次数。

以下代码来自我的书,但我将其修改为一个基本的例子。

int[] responses = { 3, 2, 5, 6, 3, 5 , 4, 5, 5, 5};
int[] frequency = new int[7];


for (int answer = 0; answer < responses.Length; answer++)
   ++frequency[responses[answer]];

for (int rating = 1; rating < frequency.Length; rating++)
   Console.WriteLine(rating + ", " + frequency[rating]);

Console.Read();

++frequency[responses[answer]];如何运作?在看这个时,如果我第一次通过循环reponses[answer],这将代表responses[0],这将是3,正确吗?这是我感到困惑的地方,这条线的++frequency部分是做什么的?

10 个答案:

答案 0 :(得分:5)

frequency[responses[answer]] = frequency[responses[answer]] + 1;

编辑:我认为编写这样的内容还不太清楚。作为个人偏好,我不喜欢对存在大量索引的元素使用一元操作(++ x,x ++等)。

答案 1 :(得分:2)

它在数组中该位置的频率上加一。

例如,在该行执行后,位置3(来自您的示例)的频率将增加1。

编辑:那么,更详细的说,当answer = 0时,响应[0] = 3,所以频率[3]会增加一个。

++也可以很容易地在命令的末尾。换句话说,

++frequency[responses[answer]];

与使用

相同(在这种情况下)
frequency[responses[answer]]++;

答案 2 :(得分:2)

让我们分解一下:正如你所指出的那样,在第一次通过时,回答[answer]将评估为“3”

所以这看起来像++频率[3]

++正在将索引3处的数组值递增1

够简单吗?

我还应该指出,在数组之前而不是之后应用++ 会影响递增的执行方式(尽管它不会影响此代码的结果)。

例如:

int n = 2;
int j = ++n;
int k = n++;

什么是j和k?

j将为3,k也将为3.这是因为如果您之前放置++,则首先对其进行求值。如果将它放在最后,它会在表达式的其余部分之后对其进行评估。

答案 3 :(得分:1)

如果有帮助,可以将++ frequency []视为“frequency = frequency + 1”。

如果++运算符位于变量之前,则在执行语句之前应用增量。如果++之后出现,则执行该语句,然后递增变量。

在这种情况下,无关紧要,因为在之前或之后递增不会影响逻辑。

由于“响应[回答]”评估为一个数字,该行代码正在递增该数组索引处的频率条目。所以第一次通过,答案是0,所以响应[答案]是3,所以频率[3]框增加1.下一次,频率[2]框增加......等等等等。

答案 4 :(得分:1)

frequency是一个数组,其中所有元素都初始化为0(int的默认值)。行++frequency[responses[answer]]将增加responses[answer]处找到的整数指出的频率元素。通过将++放在频率前面,数组元素将在返回结果值之前递增。

你可以read more about the ++ operator here

答案 5 :(得分:1)

在这种情况下,在你走过时重写代码通常很有用。

当答案= 0时

  • ++频率[响应[0]]
  • ++ frequency [3],因为响应[0] = 3
  • 频率现在看起来像{0,0,0,1,0,0,0}

当答案= 1时

  • ++频率[响应[1]]
  • ++ frequency [2],因为响应[1] = 2
  • 频率现在看起来像{0,0,1,1,0,0,0}

等等。

答案 6 :(得分:0)

这意味着在频率[3]处递增值。其中3是回复的结果[回答]。类似地,下一次迭代将以频率[2]递增值。

答案 7 :(得分:0)

当应用于整数时,C#中的++运算符会将其递增1。

您正在查看的特定行,frequency是一个包含7个元素的整数数组。这有点令人困惑,因为你在代码中解释它的方式,看起来这个代码会破坏6以上的响应数组中的任何值。

除了这个问题之外,基本上它正在递增它正在访问的数组的哪个索引。因此在您的示例中,响应[0]将为3.因此,此行将找到频率[3]的值并将其递增1.由于整数数组初始化时所有值均为零,因此在第一次迭代后,频率[3]如果你的响应数组中有另外3个,那么频率[3]会再次增加(即响应[4])。

我希望这会对你有所帮助。

答案 8 :(得分:0)

代码段的目标似乎是确定每个响应在“响应”数组中出现的次数。因此,对于您的示例集,频率[3]应为5,频率[5]应为5,等等。

因此,您询问的行从响应数组中获取当前元素,并将频率数组中的关联值增加1,以指示在响应中已观察到特定值。

一旦整个代码片段执行,频率数组包含在响应数组中观察到从0到7的每个元素的次数。

答案 9 :(得分:0)

使用频率数组来计算每个响应输入的次数。你可以为每个答案都有一个计数器:

int numberOfOnes = 0;
int numberOfTwos = 0;
// Etc...

但那将是丑陋的编程,而不是那么容易或有效。使用频率数组允许您不使用if / else if块或开关,使代码更易于阅读。

关于频率数组的另一件事。

int[] frequency = new int[7]; 

这会将数组中的所有整数初始化为0,这就是为什么你可以通过递增它来开始,而不是看它是否是第一次进行特定响应,然后用1或类似的性质初始化它。 / p>

祝你拥有所有有趣的C#。