为什么C ++和C#编译器的输出不同?

时间:2011-07-10 02:20:52

标签: c# c++ compiler-construction

之前我被问过这个问题,但这次我想知道C++C#的编译器之间的区别。

数组的C#编码

static void Main(string[] args)
    {
        int n;
        int[] ar = new int[50];
        Console.Write("Enter the size of array= ");
        n = int.Parse(Console.ReadLine());
        for (int i = 0; i < n; i++)
        {
            ar[i] = int.Parse(Console.ReadLine());
        }
        for (int i = 0; i < n; i++)
        {
            Console.WriteLine("AR[" + i + "]=" + ar[i]);
        }
        Console.Read();
    }

输出

C# output

数组的C ++编码

int main()  
{  
    clrscr();  
    int x[10];  
    int n;  
    cout << "Enter the array size= ";  
    cin >> n;  
    cout << "Enter the elements for array= ";  
    for(int i = 0; i < n; i++)  
    {  
        cin >> x[i];  
    }
    for(int i = 0; i < n; i++)  
    {  
        cout << "x[" << i << "]=" << x[i] << "\n";  
    }   
    getch();  
    return 0;  
}

输出

C++ output
现在我的问题是,当m为C#提供相同的输入时,它要求输入4个元素并在任何数字之前保留0。但是当我在C ++中使用相同的输入时,它会将0与任何数字一起考虑为单独的输入,即使给它一个数字,然后我输入的输入也会减少。

即使两种语言都遵循OOP方法。那么两个编译器之间有什么区别呢。为什么这些采取了大量不同的输入并产生不同的输出。

还有一件让我感到困扰的是,为什么C ++编译器没有为最后一个元素读取0并打印7但是我的输入是07所以根据它的上面输出它应该是0而不是7。

2 个答案:

答案 0 :(得分:5)

这是一个完整的猜测,但Borland C ++正在尝试将前导0的数字解释为八进制(这是一个标准约定,如十六进制的'0x'前缀)。由于08不是有效的八进制数(只有0-7是八进制的有效数字),它将它分成两个输入。

尝试输入'010',如果程序打印出8,你就会知道它正在解释任何前导零为八进制的东西。

您还可以尝试通过将输入行更改为:

来强制cin将输入解释为十进制
cin >> dec >> x[i];

答案 1 :(得分:3)

首先,在两种不同的语言中使用两个不同的函数来执行相同的操作并不会有任何意外,这会给你带来微妙的不同结果。如果您想知道它们各自的作用,请查看文档。

更具体地说,C ++中的cin >> i肯定与C#中int.Parse(Console.ReadLine())的行为不同。例如,C ++版本能够从同一行读取多个数字(由空格分隔),而C#版本则不是。

但是对于您的具体示例,这看起来像是您使用的编译器中的错误,或者可能是规范不清楚。如果我在Visual Studio中编译C ++代码,它的行为方式与C#版本相同。

另外,我不确定你究竟是什么意思,但你的C ++代码肯定不会“遵循OOP方法”。 (我不是说它应该,只是它没有。)