我很无聊,所以我决定创建一个小石头剪刀游戏。它并不完整,因为我只想包含必要的代码。它看起来像这样:
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类型的结果。
我们可以收集所有这些细节来了解发生了什么:
- 我们正在呼叫
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开始的那样,将
char
和char
与+
运算符相加将得到int
:- znak[0]111'o'字符
- znak[1]32''字符
- znak[2]47'/'字符
- 所以
znak[0] + znak[1]
=143
,143 + znak[2]
=190
(such as 190 228 235 for Scissors
( - 现在我们从3个
When one or both operands are of type string, the + operator concatenates the string
开始,所以:190 + " "
="190" + " "
="190 "
- 现在在左手边我们有一个
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
。