程序将字符写成ascii代码,但只是有时

  • 本文关键字:代码 字符 ascii 程序 c#
  • 更新时间 :
  • 英文 :


我很无聊,所以我决定创建一个小石头剪刀游戏。它并不完整,因为我只想包含必要的代码。它看起来像这样:

class Program
{
static void Main(string[] args)
{
char[] enemyznak = new char[9];
char[] znak = enemyznak;
char input;
Console.WriteLine("A as in pAper, D as in Diorite, S as in Scissors");
Random random = new Random();
while (true)
{
Input:
input = Console.ReadLine()[0];
switch (input)
{
case 'A': znak = Paper(znak);
break;
case 'D': znak = Rock(znak);
break;
case 'S': znak = Scissors(znak);
break;
default: Console.WriteLine("Unknown Character"); goto Input;
}
switch (random.Next(0,3))
{
case 0: enemyznak = Paper(enemyznak);
break;
case 1: enemyznak = Rock(enemyznak);
break;
case 2: enemyznak = Scissors(enemyznak);
break;
}
Console.WriteLine(znak[0] + znak[1] + znak[2] + "         " + enemyznak[0] + enemyznak[1] + enemyznak[2]);
Console.WriteLine(znak[3] + znak[4] + znak[5] + "         " + enemyznak[3] + enemyznak[4] + enemyznak[5]);
Console.WriteLine(znak[6] + znak[7] + znak[8] + "         " + enemyznak[6] + enemyznak[7] + enemyznak[8]);
}
}
static char[] Rock(char[] znak)
{
// just like Scissors except different characters
}
static char[] Scissors(char[] znak)
{
znak[0] = 'o';
znak[1] = ' ';
znak[2] = '/';
znak[3] = ' ';
znak[4] = '¤';
znak[5] = ' ';
znak[6] = 'o';
znak[7] = ' ';
znak[8] = '\';
return znak;
}
static char[] Paper(char[] znak)
{
// just like Scissors except different characters
}
}

在打印阶段,它将玩家的符号显示为奇怪的数字(例如剪刀的190 228 235(。然而,敌人的符号是以字符的形式写出来的。我试着比较这些片段,但它们对我来说似乎是一样的,那么是什么导致了这种不一致呢?

您遇到了C#运算符优先级及其隐式行为。

为了充分理解这种行为,让我们从三件事开始:

  • 您的代码实际调用的内容
  • +运算符的工作方式
  • char型是什么

1.您的代码实际调用的是什么

让我们关注给定的行:

Console.WriteLine(znak[0] + znak[1] + znak[2] + "         " + enemyznak[0] + enemyznak[1] + enemyznak[2]);

一旦你在去触发时介入,你会看到这个方法的签名是:public static void WriteLine(string? value)

2.+操作员的工作原理

参见文档:+和+=运算符(C#参考(

简而言之:

当一个或两个操作数都是字符串类型时,+运算符连接字符串

3.什么是char类型

参见文档:char(C#参考(

简而言之:

此外,对于char操作数,算术和逐位逻辑运算符对相应的字符代码执行运算,并生成int类型的结果。

我们可以收集所有这些细节来了解发生了什么:

  1. 我们正在呼叫Console.WriteLine(znak[0] + znak[1] + znak[2] + " " + enemyznak[0] + enemyznak[1] + enemyznak[2]);(所以是WriteLine(string? value)(2,能够调用WriteLine(string? value)的程序将创建一个具有以下值的string?类型的变量:znak[0] + znak[1] + znak[2] + " " + enemyznak[0] + enemyznak[1] + enemyznak[2]
  2. 正如我们现在从2开始的那样,将charchar+运算符相加将得到int
    • znak[0]111'o'字符
    • znak[1]32''字符
    • znak[2]47'/'字符
  3. 所以znak[0] + znak[1]=143143 + znak[2]=190(such as 190 228 235 for Scissors(
  4. 现在我们从3个When one or both operands are of type string, the + operator concatenates the string开始,所以:190 + " "="190" + " "="190 "
  5. 现在在左手边我们有一个string。因此(如我们从3中所知("190 " + + enemyznak[0] + enemyznak[1] + enemyznak[2]将产生string

您可以运行以下实验:

  • 在开头添加空字符串:
Console.WriteLine("" + znak[0] + znak[1] + znak[2] + "         " + enemyznak[0] + enemyznak[1] + enemyznak[2]);
Console.WriteLine("" + znak[3] + znak[4] + znak[5] + "         " + enemyznak[3] + enemyznak[4] + enemyznak[5]);
Console.WriteLine("" + znak[6] + znak[7] + znak[8] + "         " + enemyznak[6] + enemyznak[7] + enemyznak[8]);

看看会发生什么。由于您有string+char,它将产生string

最新更新