【问题标题】:How does C# recognize the 0 and 1 in these lines of code as num 1 and num2? [duplicate]C#如何将这些代码行中的0和1识别为num 1和num2? [复制]
【发布时间】:2019-11-12 03:37:55
【问题描述】:

我的指令是编写一个 C# 程序,在屏幕上打印用户输入的两个数字的加、减、乘和除的输出。

下面的代码行似乎是输入值并打印出来的最简单方法。 {0} + {1} = {2} 是 C# 天生内置的表达式吗?我不确定在这种情况下 num1 和 num2 是如何被选为 0 和 1 的,而答案是 2。

Console.Write("Enter a number: ");
int num1= Convert.ToInt32(Console.ReadLine());
Console.Write("Enter another number: ");
int num2= Convert.ToInt32(Console.ReadLine());

Console.WriteLine("{0} + {1} = {2}", num1, num2, num1+num2);
Console.WriteLine("{0} - {1} = {2}", num1, num2, num1-num2);
Console.WriteLine("{0} x {1} = {2}", num1, num2, num1*num2);
Console.WriteLine("{0} / {1} = {2}", num1, num2, num1/num2);
Console.WriteLine("{0} mod {1} = {2}", num1, num2, num1%num2);
//10 + 2 = 12                                                                                                   
//10 - 2 = 8                                                                                                    
//10 x 2 = 20                                                                                                   
//10 / 2 = 5                                                                                                    
//10 mod 2 = 0 

【问题讨论】:

标签: c#


【解决方案1】:

此行中的表达式{0} + {1} = {2}

Console.WriteLine("{0} + {1} = {2}", num1, num2, num1+num2);

不代表 0 + 1 = 2{0} 表示逗号后的第一个参数(即num1)。一般来说,{x},其中x是大于等于0的整数,表示逗号后面的x参数,其中第一个参数是{0},第二个是{1},以此类推。这是由于 C# 具有 从零开始的索引,这基本上意味着集合(或集合)中项目的索引(或位置)从 0 第一项 1 开始以此类推……

字符串"{0} + {1} = {2}" 是一个格式化字符串,其中{x} 被逗号后的x 参数替代。因此,在前面的代码行中,如果num1 = 7num2 = 4,那么它将打印: 7 + 4 = 11,因为{0} = num1 = 7{1} = num2 = 4{2} = num1 + num2 = 7 + 4 = 11

代码的其他 Console.WriteLine 行也是如此。

这是另一个例子:

Console.Write("Enter your name: ");
string name= Console.ReadLine();
Console.Write("Enter your last name: ");
string lastName= Console.ReadLine();
Console.Write("Enter your age: ");
int age = Convert.Int32(Console.ReadLine());

Console.WriteLine("Your name is {0} {1} and your age is {2}", name, lastName, age);

这里,{0} = name{1} = lastName{2} = age

【讨论】:

  • {0} 指索引
  • @Saif 当然可以。但是认为将 基于零的索引 行转储到 OP 对他/她来说似乎很复杂。
  • @Saif 已编辑,试图解释得通俗易懂。
  • {} 表示占位符,0 表示索引中的值0
【解决方案2】:

Console.WriteLine 是一个带参数的方法

Console.WriteLine 是“只是”一个接受参数的方法,在调用该方法时会评估这些参数。

请考虑以下示例。

static void PrintSum(int num1, int num2, int result) {
    Console.WriteLine("{0} + {1} = {2}", num1, num2, result);
}

PrintSum(num1, num2, num1+num2);
// 10 + 2 = 12

params object[]

事实上,WriteLine 可以接受params object[] 并且当WriteLine 被调用时,参数已经被评估。我希望下面的 sn-ps 有助于展示正在发生的事情。

片段 1

static void WriteLineWrapper(string template, params object[] objects) 
{
    for(int i = 0; i< objects.Length; i++ )
    {
        Console.WriteLine($"{i}: {objects[i]}");
    }
    Console.WriteLine(template, objects);
}

(...)

WriteLineWrapper("{0} + {1} = {2}", num1, num2, num1+num2);

输出

0: 10
1: 2
2: 12
10 + 2 = 12

片段 2

static void Print(params object[] toPrint) {
    // Note the change of order 0,2,1,3, not 0,1,2,3
    Console.WriteLine("{0} {2} {1} = {3}", toPrint[0], toPrint[1], toPrint[2], toPrint[3]);
}

static void Main(string[] args)
{
    int num1 = 10;
    int num2 = 2;
    Print(num1, num2, "+", num1+num2);
    Print(num1, num2, "-", num1-num2);
    Print(num1, num2, "*", num1*num2);
    Print(num1, num2, "/", num1/num2);
    Print(num1, num2, "mod", num1%num2);

    Print(num1, num2, "+"); // Oops
}

输出

10 + 2 = 12
10 - 2 = 8
10 * 2 = 20
10 / 2 = 5
10 mod 2 = 0
Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.

字符串插值

顺便说一句。你可以使用$ - string interpolation (C# reference)

Console.WriteLine($"{num1} + {num2} = {num1+num2}");
Console.WriteLine($"{num1} - {num2} = {num1-num2}");
Console.WriteLine($"{num1} x {num2} = {num1*num2}");
Console.WriteLine($"{num1} / {num2} = {num1/num2}");
Console.WriteLine($"{num1} mod {num2} = {num1%num2}");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2022-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2020-01-11
    相关资源
    最近更新 更多