为什么我没有收到C#(以及其他问题)中过多的数字警告?

时间:2015-07-02 20:03:55

标签: c#

我自己学习C#,并且正在解决项目欧拉问题。我已经编写了下面的代码来解决problem 8,它要求在一长串数字中找到13个连续数字的最大乘积。我从文件中将这个数字序列读入程序。

首先,我开始定义数字变量" maxProduct"和" productTmp"因为它有类型" int",但我没有得到正确的答案,因为它大于这种类型的最大范围。令我困惑的是,我没有收到错误或警告,说我在处理我的注册时试图操纵太大的数字。相反,它似乎"环绕"它的范围似乎毫无用处。这是它应该是怎么回事?

其次,它在网上找到的文件部分是我在网上找到的。但是,出于某种原因,我不能只编写" IO.StreamReader",但我必须包含" System。"在它面前,即使我已经包含了"使用系统;"线。我认为使用声明使所有内容都包含在" System"可用于没有System.-前缀的参考。

第三,在它读取文件的while循环中,发生了什么?我的猜测是(line = file.ReadLine())是一个布尔语句,但在这种情况下,它可以等于null是没有意义的。另外,我没有给出" line"一个值,因此该语句看起来像是将line的null值与其他值进行比较。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace problem8
{
class Program
{
    static void Main(string[] args)
    {
        int noAdjacentDigits = 13;

        long maxProduct = 0;
        string numberSequence = "", line;


        System.IO.StreamReader file = new System.IO.StreamReader("C:/problem8.txt");
        while ((line = file.ReadLine()) != null)
        {
            numberSequence = numberSequence + line;
        }

        for (int i = 0; i <= numberSequence.Length-noAdjacentDigits;i++)
        {
            string substrTmp = numberSequence.Substring(i, noAdjacentDigits);
            long productTmp = 1;
            for (int j = 0; j <= noAdjacentDigits-1; j++)
            {
                productTmp = productTmp * int.Parse(substrTmp.Substring(j,1));
            }
            if (productTmp > maxProduct) maxProduct = productTmp;
        }

        Console.WriteLine(maxProduct);
        Console.ReadLine();
    }
}
}

3 个答案:

答案 0 :(得分:6)

  相反,它似乎“环绕”它的范围,这似乎毫无用处。这是怎么回事?

是的,除非您将数学放在checked块中或使用/checked编译器选项。该决定主要是出于性能原因,因为溢出检查需要时间并且通常不是必需的。

  

我不能只写IO.StreamReader,但我必须在其前面加System.

您无法在命名空间的中间启动声明。将Using System.IO添加到顶部,您只需输入StreamReader

  

我的猜测是(line = file.ReadLine())是一个布尔语句

不,ReadLine返回一个字符串,如果已到达文件末尾,则为null

documentation非常明确:

  

从当前流中读取一行字符,并将数据作为字符串返回。

     

...

     

如果到达输入流的末尾,则返回值为null

答案 1 :(得分:1)

  

但出于某种原因,我不能只写“IO.StreamReader”,但我必须包含“System”。在它面前,即使我已经包含了“使用系统”;线。我认为using语句使得“System”中包含的所有内容都可以在没有System.-前缀的情况下进行参考。

System命名空间中的所有类型都将由using System;提供,但System.IO不是类型,而是另一个命名空间。不过,您可以编写using System.IO;,然后直接使用StreamReader

  

第三,在它读取文件的while循环中,发生了什么?我的猜测是(line = file.ReadLine())是一个布尔语句,

不是。赋值的结果是指定的值。 (line = file.ReadLine()) != null调用file.ReadLine(),将结果分配给line,然后检查分配的值(函数调用的结果)是否为null

答案 2 :(得分:1)

语句可以在checked or unchecked contexts中执行。

  

在已检查的上下文中,算术溢出会引发异常。在未经检查的上下文中,将忽略算术溢出并截断结果。

C#语言规范§7.6.12规定了以下默认行为

  

对于未经任何已检查或未经检查的运算符或语句包含的非常量表达式(在运行时计算的表达式),默认溢出检查上下文未选中除非外部因素(如作为编译器切换和执行环境配置)调用检查评估。