输出
C#中使用Console.WriteLine("我是字符串");进行换行输出,相当于Python中的print("我是字符串")
使用Console.Write("我是字符串")可以进行不换行输出,相当于Python中的print("我是字符串", end="")
输入
C#中使用Console.ReadLine();可以进行单行字符串输入读取,返回值为string类型,可以使用string user_input = Console.ReadLine();进行输入结果的接收,但是不能直接写入提示词。可以将Console.Write()和Console.ReadLine()结合来达到有提示词的输入的效果。
Console.Read();会进行单字符输入,返回值为int类型,int的数值为输入字符的对应ASCII码表上的数字。但是,注意,回车键(\r)和换行键(\n)都属于输入。所以,当你输入a并按下回车确认输入后,实际是输入了a、\r、\n这三个字符。
然而,char user_input = Console.Read()中,user_input只会存储一个'a'字符,另外两个字符去哪里了呢?
你可以尝试输入以下代码:
using System;
namespace Csharp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("-----start-----");
int a = Console.Read();
Console.WriteLine("-----1-----");
string b = Console.ReadLine();
Console.WriteLine("-----2-----");
Console.WriteLine(a);
Console.WriteLine("-----3-----");
Console.WriteLine(b);
Console.WriteLine("------end------");
}
}
}
运行结果如下:
-----start-----
a
-----1-----
-----2-----
97
-----3-----
------end------
可以看到,Console.ReadLine()并没有要求我们填写内容,而是直接往后运行,这是为什么呢?
首先输入并不是直接到达变量的,而是有一个输入→缓冲区→变量的过程。
首先,我们输入了三个字符a(ASCII码97)、\r(回车键)、\n(换行)到缓冲区内。
然后,Console.Read()由于只读取单个字符,就取走了字符a放入变量a中,此时,缓冲区剩余\r和\n。
最后,Console.ReadLine()看到缓冲区中还有字符,就没有要求用户输入,而是直接从缓冲区拿走剩余的\r和\n。
我们可以用以下代码验证:
using System;
namespace Csharp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("-----start-----");
int a = Console.Read();
int b = Console.Read();
int c = Console.Read();
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
}
}
}
运行结果如下:
-----start-----
a
97
13
10

查阅ASCII码表可以发现,13和10对应的就是回车键和换行,验证了我们的想法。
不过,一般情况下,我们只需使用Console.ReadLine()即可,缓冲区相关知识仅作为扩展。
注释
C#中注释使用双斜杠//。如://我是注释。
多行注释下,使用/*代表注释开始,*/代表注释结束。即完整的多行注释为/*我是多行注释*/。
变量
C#作为强类型语言,变量定义时必须确定其类型。
比较基础的类型有string,int,double,char,bool。
分别对应字符串,整数,小数(双精度),字符,布尔类型(true和false)
using System;
namespace Csharp
{
class Program
{
static void Main(string[] args)
{
int int_value = 1;
double double_value = 1.1;
char char_value = 'a';
string string_value = "123456789";
bool bool_t = true;
bool bool_f = false;
}
}
}
其中,字符字面量需使用单引号,如'a';字符串字面量则需使用双引号,如"abcde"。bool类型只有两种值,分别为true(真)和false(假)。
可以使用var a = "abcde",此时看似没有定变量a的类型,实际上var会根据a被赋的值的类型确认a的类型,后续a都被视为这一类型,无法改变,和直接声明变量a的类型没有区别。
类型转换
首先,要明确一个概念:类型的大小。
如int,它的值范围约为正负21亿;而char的值的范围为ASCII码表的范围,也就是0~255。
很明显,int类型是比char类型大的。
假如现在有变量a(char类型)和变量b(int类型)
我们可以写int c = a,却不能写char c = b,就是因为int是大容器,而char是小容器。我们只能把小箱子放进大箱子里,而不能把大箱子放进小箱子里。
这样,把小箱子直接放进大箱子的类型转换,就叫隐式转换。
然而,int类型的值尽管可以为正负21亿,int类型变量的值也有可能在0~255之间,这时候想把int类型转为char类型,该怎么办呢?
我们照上面的例子,可以写char c = (char)b,通过在int类型的变量前加上(char)来表明,我就是要强行转换。
这样,强行把大类型转为小类型的转换,就叫显式转换。
int和char类型之间的转换会根据ASCII码表,进行字符和对应表内数字的转换。
我们知道,Python中有int()可以把带有数字的字符串转为int类型,即把"12345"转为了12345。那么,C#中要怎么进行这样的转换呢?
我们可以使用Convert.ToInt32()。在括号内填入string类型的数,会返回对应的int类型的数,和Python中的int()效果一致。
增量表达式
在Python中,如果我们想让一个int变量a自增,会写a += 1,而自减则是 a-=1。
在C#中,我们可以使用a++和a--代替。不需要重新赋值,a++就等效于a = a+1,a--同理。
除了a++,你也可以写++a,这两种写法在你单独一行写是没有任何区别。
但是,当你把他们套入其他式子时就会发生区别。
using System;
namespace Csharp
{
class Program
{
static void Main(string[] args)
{
int a = 1;
Console.WriteLine(a);
Console.WriteLine(a++);
Console.WriteLine(a);
Console.WriteLine(++a);
Console.WriteLine(a);
}
}
}
运行结果如下:
1
1
2
3
3
可以看出,++a会先自增,再把自增后的结果返回;而a++则是会先把a返回,再进行自增。自减同理。
逻辑运算
C#中的与或非分别为&&、||、!。对应Python中的and、or、not。
其余没有区别。
顺序结构完结!下一篇讲选择结构~

Comments NOTHING