目录

第3章——数据类型和基本控制结构

在学习编写代码的过程中使用代码

重命名Main函数

学习处理错误

一步一步地完成每一步

错误代码

什么是函数签名?

重载函数:大量可接受的函数签名

修正您的Main方法

有关字符串args []的更多信息

Args代表什么?

Args []可以做什么?

OmniSharp可以提供帮助

使用字符串插值

让我们使用参数值

仅在最少有一个时尝试使用args

字符串数组

声明变量类型

变量名

名称是一个内存地址

编译器和构建程序

使用字符串变量

了解错误和警告:更好的程序员

其他数据类型

注释符号//

开发人员选择数据类型

按最大值选择数据类型

一个变量中包含多个值:数组

数组已建立索引

数组以0为基数索引

遍历整个数组

C#语言控制结构

Foreach控制声明

Args的全部

VSC语法着色

总结


  • GitHub下载源代码-raddevus / ProgLinuxWDNC:《
    使用.NET Core编程Linux》一书的源代码 [ ^ ]

如果您只是刚加入,可以在以下位置找到本书的开头:

  • 使用.NET Core 3进行Linux编程3:简介&第2章 [ ^ ]

第3章——数据类型和基本控制结构

以下是您将在本章中学到的一些知识:

  • 编译器错误和警告
  • Main()函数签名要求
  • 数据类型(int,string,float)
  • 数据类型数组
  • 如何从终端命令行获取输入

在学习编写代码的过程中使用代码

有些书教您有关语法和数据类型的所有知识,以及所有语言的知识,但是在本书中,我向您展示了如何使用代码,然后我们讨论了代码为什么起作用。在此过程中,您将学习语法和数据类型以及其他内容,但是您还将看到实际的代码。

让我们创建另一个新项目。打开终端并转到目标目录,然后运行以下命令:

$ dotnet new console -o SuperConsole

完成此操作后,打开Visual Studio Code(VSC)并打开项目文件夹。

当您打开项目文件夹时,VSC会注意到您正在打开一个基于C#的项目,它将在右下角弹出一个小窗口。

那就是我们先前安装的OmniSharp插件(或扩展)。看起来如下:

由于我们要激活该插件以帮助我们完成该项目,因此您可以继续并单击[]按钮,该插件将被激活。

完成此操作后,返回并单击左上角的“文件导航器”图标,然后选择Program.cs文件。

当然,您可以看到这个项目再次使用相同的一行代码输出Hello World!

继续并删除该行代码,然后再讨论一下Main函数。

重命名Main函数

删除代码行之后,继续并重命名该Main函数,以便像在以下代码片段中所做的那样对它进行命名为MainX。您可以根据需要复制它:

static void MainX(string[] args)
{}

保存所做的更改,然后返回到终端窗口,然后尝试运行该程序。

$ dotnet run

学习处理错误

当您这样做时,您将得到一个错误。

一步一步地完成每一步

当您看到所有红色文本时,可能会有点不知所措。这就是为什么最好真正检查一下,看看您能对它有什么理解。

错误代码

它说CSC : error CS5001。这就是CSC(C Sharp编译器),它可以查看您的代码并将其转换为程序,告诉您已发生错误,将其标识为CS5001。

提供了特定的错误代码以便于查找。最初,错误代码对我们来说意义不大,但是如果我们要在DuckDuckGo.com(我选择的搜索引擎)上进行搜索,那么您可以获得更多详细信息。

这是有关它的正式Microsoft文档:

  • https://docs.microsoft.com/zh-cn/dotnet/csharp/misc/cs5001

就像我在上一章中所说的那样,您需要在程序中有一个Main方法作为程序的入口点(起点)。

什么是函数签名?

但是,Main方法上的名称可能正确,但签名不正确。

让我们返回并将其MainX更改为Main。但是这一次,请从函数开头删除静态单词。现在将如下所示:

void Main(string[] args)
{}

进行更改后,保存文件并返回到终端,然后再次尝试运行它。

$ dotnet run

即使由于两个略有不同的原因而发生了错误,您也会收到相同的错误:

编译器无法始终区分并给出错误发生的特定原因,您将不得不习惯于仔细研究为什么事情可能无法正常工作。

在这种情况下,Main函数签名不是很正确。

再有一个术语:函数签名。但是什么是函数签名?

函数签名由四部分组成:

  1. 函数名称
  2. 函数参数类型
  3. 函数返回类型
  4. 函数修饰符

为了确定您是否具有正确的Main函数,必须确保所有这四件事与C#语言定义的允许签名匹配。

在这种情况下,我们具有正确的函数名称。它是Main并且第一个字母必须是大写的,其余的必须是小写。

我们有正确的参数类型。在这种情况下,唯一的参数是一个类型如下的String数组:

string args[ ]

接下来,我们有一个正确的返回类型为void。

关键字void表示该函数实际上不返回任何内容。

最后,函数签名也必须具有相同的修饰符。在这种情况下,缺少static函数修饰符。注意:public方法的一部分也是修饰符的一部分。稍后我们将详细了解这些修饰符,但现在不必担心。

由于函数签名中缺少关键字static,因此CSC(C#编译器)无法找到有效的Main方法。

重载函数:大量可接受的函数签名

如果您在Main函数的Microsoft文档中进行了更多挖掘,则会找到有效Main函数签名的列表。该Main函数被称为重载,因为它可以识别同一函数名称的多个签名。在继续阅读本书时,您将学到更多有关重载函数的信息。

如您所见,所有有效Main方法都具有public static修饰符。如果删除或更改了这些修饰符关键字中的任何一个,则方法签名将不正确。

我们不会谈论所有其他签名,但是现在您了解,对于如何创建有效的控制台应用程序的Main方法存在明确的要求。

修正您的Main方法

继续,然后再次将关键字static添加到您的方法中,这样我们就不会继续出错。

public static void Main(string)
{}

另外,最好继续构建并运行该程序,以确保再次正确设置了所有程序。

$ dotnet run

当然,该程序现在不输出任何内容,因此在运行时什么也没有发生。

现在,让我们开始检查控制台库。

有关字符串args []的更多信息

Main拥有的模板项目提供的一个参数是string args[]。

那是string的数组。这意味着该变量名为args可以包含0到许多字符串。

Args代表什么?

名称args表示参数。一些开发人员会引用函数作为其参数的参数。参数或参数是函数将接受并处理或使用的变量列表。

在这种情况下,由于这是main方法,因此这些是用户在启动应用程序时可以从终端传递给程序的值。

一个很好的例子是,当我们使用cd命令更改目录并为其指定路径或目录名称时。

$ cd ~

这将我们带到用户主(home)目录。~是参数或cd命令的参数。

另一个示例是ls命令。

如果我们希望它在单独的一行中以列表形式列出文件和目录,则可以为其提供-l参数。

这是ls本身和ls -l的示例。

Args []可以做什么?

使用该args数组,我们可以获得启动程序时在命令行上输入的用户输入。实际上有点酷。

让我们开始添加一些代码。我们想要获取用户提供的参数数量。我们可以通过检查args变量的Length属性来做到这一点。

OmniSharp可以提供帮助

因为我们已经在VSC中安装并激活了OmniSharp扩展,所以我们将获得Intellisense代码完成。这意味着当我们开始键入代码时,该扩展实际上将运行一个程序,以查看正在使用的.NET库内部并获取一些可能对我们有帮助的信息。

这是一个例子。

键入Console.WriteLine时,扩展名将在库中查找注释和参数名称以及更多内容,然后它将在VSC中弹出信息。

您可以看到它开始尝试帮助我的Console.WriteLine,但是由于该Console.WriteLine方法的一次重载而停止。看到它们02/18之间的向上/向下箭头指示吗?这说明这是Console.WriteLine十八种重载方法中的第二个重载。有许多采用许多不同参数的Console.WriteLine方法。

另外,请注意,键入args.L后我立即拍摄了快照,OmniSharp扩展名告诉我有两个可能的选择(Length和LongLength)。我知道我想要Length,所以我可以单击列表中的项目或按<ENTER>,突出显示的选择将在VSC中自动键入。

这是我的最终代码:

public static void Main(string[] args)
{Console.WriteLine(args.Length);
}

有了该代码后,继续保存文件并切换回终端窗口并运行它。

$ dotnet run

您可以看到它报告用户已发送了0个参数。这很有意义,因为我们没有添加任何内容。

再试一次,但是这次添加两个参数。每个参数都用空格简单分隔。

$ dotnet run first second

您可以看到它现在报告提供了两个参数。

使用字符串插值

我们的输出不是很好,因为它只输出数字。让我们学习如何使用String插值器,这将允许我们创建一个漂亮的输出字符串,其中包含变量值以及描述性字符串。

让我们改变我们的当前代码,这是写行输出,使它现在看起来像以下:

Console.WriteLine($"There are {args.Length} args.");

普通字符串文字是用两个双引号引起来的任何字符,如下所示:

"This is a string"
"I am also a string"
"Anything between double quotes"

但是,如果我们想在字符串中包含一个变量值并希望输出该值,则可以$在第一个双引号之前使用字符串插值器。

这告诉编译器,只要它在双引号之间(也在大括号之间)找到项目,就应该从该项目中检索值并将其替换为字符串,以便该值显示在字符串中,而不是变量名中。在我们的示例中,字符串插值器将获取args.Length的值并将其替换到string中。

您的代码现在将如下所示。保存后,继续运行。

public static void Main(string[] args)
{Console.WriteLine($"There are {args.Length} args.");
}

该输出对用户来说更好,更有用,现在您知道如何在一个漂亮的格式化字符串中间将值添加到您的输出中。我们将始终使用字符串插值,因此请密切注意。

如果您想立即阅读有关插值的更多信息,请查看此链接。

让我们使用参数值

好吧,知道有多少个参数被传入非常好,但是如果我们能够以某种方式使用实际参数,那就更好了。

仅在最少有一个时尝试使用args

最好仅在存在一个或多个时尝试使用args。

为此,我们可以使用一条if语句。一条if语句允许我们仅在某些情况下为true才进行操作来控制程序。

例如,如果args.Length大于零,那么我们做点什么。

要将其编写为代码,必须使用if语句的正确C#语法(语言规则)。

看起来如下:

if (predicate){// execute functionality between curly { } braces.
}

谓词是对语句进行评估以确定其是否和true相等的语句。

在我们的例子中,我们想确定args.Length > 0是否成立,编写如下代码:

if (args.Length > 0){Console.WriteLine($"The first parameter is : {args[0]}");
}

现在,整个代码清单如下所示:

进行更改并保存文件,然后再次运行该程序,但是这次不带任何参数。

$ dotnet run<span id="cke_bm_138E" style="display: none;"> </span>

由于没有传入参数,并且代码检查args.Length > 0,因此新的if语句中的代码不会运行。

现在,使用1个或多个参数再试一次。

$ dotnet run one two

您可以看到该if语句内的代码现在可以运行。

让我们更多地讨论代码的实际作用,并讨论称为数组的特殊情况。

字符串数组

首先,C#跟踪我们正在使用的变量的类型。这意味着我们必须告诉它变量将保存的数据类型。

C#被认为是一种强类型的语言,这意味着它总是想知道我们创建的每个变量中的数据类型。

这是对开发人员的一种保护,因此她不会意外地将错误的类型存储在变量中,然后尝试对变量执行错误的操作类型并获得奇怪的结果。

这就是我的意思。

声明变量类型

当我们创建要在程序中使用的变量时,我们需要做两件事:

  1. 命名变量
  2. 定义将存储在变量中的数据类型

要设置一个新string变量供使用,我们可以简单地执行以下操作:

string firstName;
string lastName;

变量名

现在程序将了解您有两个用于放置字符串的不同存储桶。

名称是为开发人员提供一种访问变量的方式,以便她可以在其中存储值。这看起来似乎很明显,但是如果您没有在整个程序中使用的名称,则无法再次引用该变量。

名称是一个内存地址

请记住,程序本身并不真正在乎名称。在程序内部,名称实际上是一个内存地址。

在C#中,您可以轻松地执行以下操作:

string firstName = "Ted"

但是,C#将其变成类似以下内容:

0x00FC53 ["Ted"]

那是一个内存地址,字符串存储在那里。显然,知道存储firstName的值表示一个人的名字比记忆随机的十六进制存储值容易得多。

过去,程序员会研究内存地址,因为他们没有这些高级语言来允许我们使用变量名而不是内存地址。这就是C#为您所做的。它是一种高级语言,可让您使用自然语言(英语,西班牙语等)来引用程序中的内容,而不必使用某种机器语言来自己跟踪内存地址。

这是学习高级语言(如C#)的第一个优点。

编译器和构建程序

这也揭示了为什么必须先构建程序才能运行它。CSC(C#编译器)运行并检查高级语言C#,并将其转换为CPU(中央处理单元)可以理解的语言。

注意:实际上,从C#到处理器还有另一个中间步骤,但是我在这里简化了事情。

让我们将这两个变量名声明添加到我们的程序中。

我只是在Main()函数的顶部添加了它们,因此我们可以根据需要使用它们。

请注意,由于它们具有名称和类型,但是此时它们没有值,因此仅声明使用。

添加这些文件,保存文件,然后再次运行该程序。

$ dot net run one two

运行该程序时,将收到两个编译器警告。

编译器告诉您已声明它们,但从未使用过它们。这不会阻止您的程序运行。如果这将是一个错误,则编译器会阻止您。但是由于这只是一个警告,因此它允许您的程序运行。

该警告只是一项健全性检查,因为编译器想知道为什么您向程序中添加了从未使用过的内容。删除多余的/未使用的代码是最佳做法,因此它可以让您了解这些类型的事情。

使用字符串变量

要使用该string变量,我们要做的就是将其设置为一个值。

我们可以使用字符串文字(任何用双引号引起来的字符)来初始化变量。

您可以在声明变量的同一行上对其进行初始化,也可以稍后对其进行初始化。

我更改了代码,现在看起来像下面的代码:

string firstName = "Ted";
string lastName;
lastName = "Lastonian";

如果再次运行,您将看到编译器再次向我们发出警告,但是稍有不同。

现在警告我们,变量确实已分配了一个值,但从未使用过该值。有时,编译器似乎会像个老古董似的,大声疾呼有关一切的警告。

了解错误和警告:更好的程序员

但是,编译器实际上只是在尝试使事情正常进行,并且您对警告和错误意味着什么越习惯,您将成为更好的程序员。

这种能力可能是将专业开发人员与业余开发人员区分开的主要内容之一。现实世界中的软件总是会出现问题,而您处理这些问题的能力越强,您的技能就会变得越有价值。

从编译器中读取的错误信息和警告消息越多,确定问题出在哪里就越好越快。

让我们使用这两个变量来写一些输出,然后您将看到编译器停止抱怨。

我们将添加以下一行:

Console.WriteLine($"{firstName} {lastName} was here.");

整个源清单看起来像:

您可以看到我们正在使用字符串插值器来创建我们的字符串。我们将要输出的每个变量名包装在其自己的花括号中。现在,当我们运行时,我们将看到以下内容:

其他数据类型

现在我们知道C#支持字符串类型,但是它允许我们使用其他哪些类型。

以下是一些其他数据类型:

int counter;        // integer
double patientTempCelsius; decimal value, floating point (double precision)
bool isDoorClosed;  // boolean - true or false value
char middleInitial; // single character value

注释符号//

注意,在每一行的末尾,我添加了两个斜杠,然后添加了有关数据类型的注释。

这两个斜杠告诉编译器忽略其余的行。

这意味着两个斜杠之后的所有内容都只是对其他开发人员(或您自己)的注释。编译器将在这两个斜杠之后完全忽略所有内容,因此即使这些东西会导致错误,编译器也会忽略它,就好像这些字符根本不在那儿一样。

当您想删除代码行但将其保留在源文件中时,注释代码的函数也很好,因为以后可以使用它们。

如果您不希望在程序中考虑该行,只需在该行的开头添加两个斜杠。

// int x = 50;
// Console.WriteLine("This will never appear in the output.");

开发人员选择数据类型

在设计程序以执行我们希望它们执行的自动化工作时,我们选择数据类型。

我们根据将存储在数据中的数据以及需要对数据执行的操作类型来选择数据类型。

如果需要向用户显示信息,则选择字符串类型。

如果我们需要在程序中计算一些东西,那么我们将选择一个整数类型。

如果我们需要存储一件商品的价格,以便稍后可以对数量进行计算,则需要一个浮点类型(存储与美元和美分关联的小数-1.99)。

例如,假设我们有类似以下内容的东西:

float unitPrice = 2.04f;  // notice the f after the numbers
int numberUnitsAvailable = 282;
double totalCost = unitPrice * numberUnitsAvailable;
Console.WriteLine($"Total cost is {totalCost}");

如果运行该代码,则会看到类似以下内容的内容:

我们添加到unitPrice的文字值(2.04)后面的奇数f是一种确保编译器将该值视为浮点值的方法。由于在其他地方使用了十进制运算符(.),因此编译器可能会认为您以不同的方式使用它,因此我们通过提供明确地f告诉它使用2.04作为float值。

按最大值选择数据类型

但是,我们还通过考虑值将增长到的大小约束来选择数据类型。

例如,上面声明的int正则整数最多使用4个字节的内存。

四个字节是三十二位。四字节或三十二位数字只能保存以下范围内的有符号值:

-2,147,483,648至2,147,483,647

如果您需要存储大于2,147,483,647(略高于20亿)的值,则需要选择下一个大小整数,称为long。

您可以像声明int一样声明一个long。

long federalDeficitDollars;

long是8个字节(64位),可以容纳更大(或更小的)数字:

-9,223,372,036,854,775,808至9,223,372,036,854,775,807

超过9百万亿。

我们将继续讨论有关数据类型的更多信息,但这足以使您有一个大致的了解。

一个变量中包含多个值:数组

到目前为止,我们已经能够将一个值存储在一个变量中。

我们可以在一个整数变量中存储一个整数。一串变量中的一串。

现在您对数据类型有了更好的了解,让我们来讨论一个数据结构,该结构允许您将多个值存储在一个变量中。

数组是元素列表。元素类型将全部相同。

有时,您希望将值列表存储在一起,这将使遍历程序中的列表更加容易。

有时,将所有内容放在一起使用一个名称更方便,因为所有元素都是相同的数据类型并且是相似的值。

string arg[]数组是一个很好的例子。

该项目是用户已发送到程序中的项目的列表。它们都是相似的,因为它们都在程序的命令行中提供。

您可以使用到目前为止所学的任何数据类型(以及许多其他数据)来创建数组。

声明数组的全部操作是在类型之后和变量名称之前添加方括号。

int [] studentsPerClassCount;
float [] distances;
string [] lastNames;

编译器将理解您正在创建这些类型的数组,并且将使用一个名称来引用它们。每当您看到方括号时,就应该开始考虑数组。

这是因为您还将使用方括号[]将值也从数组中取出。

首先,让我们学习如何初始化数组中的值。

要初始化,您只需创建一个列表,该列表包装在一组大括号内,并且每个值之间用逗号分隔。

int [] studentsPerClassCount = {30,23,17,31,34,12,58,32};
float [] distances = {3.23f, 17.389f, 38.37f, 1.23f};
string [] lastNames = {"smith", "jones", "jackson"}

用值初始化数组后,如何获取这些值以供使用?

数组已建立索引

每个数组只是一个相同类型的数据列表。

每个数组项都存储在数组中的特定数组索引处。

用于获取特定索引处的值的语法如下所示:

<arrayVariableName>[indexValue]

提供数组变量名称,后跟一个方括号[,要获取的项目的索引值,然后是方括号]。

数组以0为基数索引

这意味着数组中的第一项为零。索引基于起始编号0,而不是1。

因此,要获取上面的distances数组中的第一个值,您只需执行以下操作:

Console.WriteLine(distances[0]);

这是此时的完整代码清单。

这是运行程序时收到的输出。

3.23的最后一个输出是distances数组的第一个元素。

我教过所有关于数组的知识,只是为了让您进入下一节。这是关于数组的真正酷的部分。

遍历整个数组

您可以遍历整个数组。这意味着您可以运行将获取数组每个元素并对其进行一些工作的代码。

C#语言和C#运行时对此有一些技巧。他们了解您的代码。他们知道您的数据类型是什么,但他们也知道特殊类型可以执行特殊操作。

C#语言控制结构

C#语言还提供了一些控制结构(if语句,foreach语句——我们将要学习的while语句,以及更多)。

这些控制结构使您可以实际控制代码的运行方式。

您已经看到了带有我们之前处理过的简单if语句的控件结构的示例。它控制if语句主体中的代码是否将运行。

现在,我们将看到一个名为foreach声明的新控件结构。

Foreach控制声明

foreach控制语句的工作具有特殊类型,如数组类型(称为集合),以确定代码是否会运行。

在我们的例子中,我们只希望代码在数组包含一个或多个元素的情况下运行。

而且,如果我们的数组包含多个元素,则我们希望控件结构运行多次。但是,我们也不希望它尝试访问比数组中元素数更高的索引。那会导致我们的代码出错。

例如,如果尝试获取distances[30]的值,则会得到一个错误。

distances数组仅包含4个元素,因此distances[30]未定义。

foreach控制语句检查所有这一切,并确保它不会超出数组的边界。

这就是迭代遍历目标数组中元素的确切数量的样子。

foreach (float f in distances){Console.WriteLine($"value : {f}");
}

我们使用控件结构(foreach)的名称,然后在左括号和右括号()内,为distances数组中存在的每个float变量定义一个新的float命名为f。

这是该foreach结构的通用版本:

foreach (type <variableName> in <array>){
}

如果要遍历strings 数组,请执行以下操作:

foreach (string LName in lastNames){Console.WriteLine(LName);
}

请注意,您声明了数组类型的新变量,然后在foreach循环结构中使用了新声明的名称。

再次,这是我们现在的整个代码清单。

这是我们的输出:

您可以看到控制台lastNames的每个距离和每个输出。

Args的全部

我们确实经历了所有这些,只是向您展示了如何获取args值。

args是一个字符串数组,所以现在您知道可以创建foreach循环并遍历用户在命令行上传入的每个项。

让我们添加以下内容:

foreach (string cmd in args){Console.WriteLine($"cmd: {cmd}");
}

我将该foreach循环放置在靠近Main方法顶部的位置,并且我将注释掉到目前为止已使用的测试代码,以便只有与args相关的部分才能真正运行。

这是我的代码现在的样子:

VSC语法着色

您可以看到VSC为您所做的语法着色将所有注释设置为绿色。这样,您可以轻松地看到代码的哪一部分将运行,哪一部分仅是注释。

运行代码时,您会看到类似以下的内容(取决于您提供给程序的命令行参数)。

令人高兴的是,如果您不提供任何参数,则该foreach语句将理解args数组中没有元素,并且不会运行该foreach语句的主体。

总结

这是很长的一章,您已经学到了很多有关控制台构建的基础以及该Main函数如何工作的知识。您还学到了很多有关数据类型的基础知识,我们甚至讨论了字符串以及如何从终端获取输入以及如何通过字符串插值完成一些格式化的输出。

使用.NET Core 3进行Linux编程:第3章相关推荐

  1. 使用.NET Core进行Linux编程3:简介和第2章

    目录 背景 我希望实现的目标 介绍 这本书的封面是什么? 这本书是给谁的? 以应用为中心 这本书不是什么 这本书是什么 GitHub上的所有源代码 DotNet Core MacOS奖金 第2章--进 ...

  2. linux系统默认的环境变量path,Linux编程 12 (默认shell环境变量, PATH变量重要讲解)...

    一 .概述 默认情况下, bash shell会用一些特定的环境变量来定义系统的环境.这些默认环境变量可以理解是上篇所讲的系统全局环境变量. 1.1 bash  shell支持的Bourne变量 Bo ...

  3. 【C#8.0 and .NET Core 3.0 高级编程学习笔记】

    @C#8.0 and .NET Core 3.0 高级编程学习笔记 前言 为了能精细地完成对C#语言的学习,我决定选择一本书,精读它,理解它,记录它.我想选择什么书并不是最重要的,最重要的是持之以恒的 ...

  4. 学习linux编程(一)

    本文导航 一. Linux基础知识杂记 0. terminal操作快捷键等 1. 为什么vfork的子进程里用return,整个程序会挂掉,而且exit不会(zz) 2. 进程内存管理详解 3. 关于 ...

  5. Linux编程题:信号量同步三进程依次打印若干次ABC

    三个进程依次打印ABC..... 思路及大致流程如下: 思路取自这位大哥: Linux编程题:创建3个线程分别打印abc,用信号量进行同步_cleverlemon的博客-CSDN博客 这位大哥写的是线 ...

  6. linux编程取消wait函数,Linux编程基础之进程等待(wait()函数).pdf

    Linux编程基础之进程等待(wait()函数) 编程过程中,有时需要让一个进程等待另一个进程 ,最常见的是父进程等待自己的子进程 ,或者父进程回收自己 的子进程资源包括僵尸进程.这里简单介绍一下系统 ...

  7. Linux 编程经典书籍推荐

    成为一名精通 Linux 程 序设计的高级程序员一直是不少朋友孜孜以求的目标.根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows 程序员的 1.8 倍.Java 程序员的 ...

  8. .NET Core 中的并发编程

    今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.操作系统通过将进程调度到不同的内核来发挥这个结构的优点. 然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序 ...

  9. linux的编程命令,linux编程常用命令

    学习linux编程最基本的就是要掌握常用的编程命令,下面由学习啦小编为大家整理了linux编程常用命令相关知识,希望大家喜欢! linux编程常用命令1.编译应用程序 make -f makefile ...

最新文章

  1. Svn 笔记—— Hooks
  2. python所有函数用法_Python函数使用方法(高级用法)
  3. 中呜机器人编程视频教程_清华北大泄露Python436集视频教程,这就是你现在需要的...
  4. Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32
  5. vue路由守卫判断用户是否登录,如果没登陆就跳转到登录
  6. java gb13000_浅谈 GB13000
  7. 文件管理软件 云服务器,使用KDE Plasma文件管理器(Dolphin)连接到Linux上的服务器...
  8. 一加8T真机渲染图泄露:后置四摄+双闪光灯
  9. 酒店房间登记与计费管理系统《c语言课程设计》 文库,C语言课程设计--酒店房间登记与计费管理系统程序代码...
  10. [转]【Linux】一幅图秒懂LoadAverage(负载)
  11. shell脚本计算任意个数的加减乘除
  12. 2006年 上半年 网络管理员 下午试卷
  13. 自动化运维工具(ansible入门教程)
  14. c语言,指针与数组--指针与二维数组2
  15. 厂商为什么喜欢使用堆叠?
  16. Java 序列化漏洞多到修不完
  17. 尔雅大学计算机基础知识点,超星尔雅_大学计算机基础_章节测试答案
  18. 荷马史诗 csdn_拥有荷马·辛普森的创造力时如何学习网页设计
  19. Redis是什么?怎么用?
  20. 获取执行程序的原路径(绝对路径)

热门文章

  1. python3 unicode_Python3 encode中的unicode-escape和raw_unicode_escape
  2. C语言指针实数组输入输出,C语言:回来两个数组中第一个元素的指针,并输出这个值...
  3. DPVS_吊打面试官的项目——DPVS
  4. pythonwindows文件_python查询windows文件
  5. 年味十足的喜庆红色新年春节海报PSD模板
  6. 设计潮流趋势|背景图案素材,增加设计对比和补充前景元素
  7. 西工大18秋《C语言程序设计》平时作业,西工大18秋C语言程序设计平时作业答案...
  8. python主讲移动端自动化测试框架appium_Appium-移动端自动测试框架,如何入门?...
  9. 2020全球开源基础设施技术峰会分享 | 自研软硬一体化加速方案
  10. Linux Socket C语言网络编程:SCTP Socket