Dk的C/C++教程(3-2)【附录】类型转换

一个测试程序员到了酒吧,要了1杯酒。

一个测试程序员到了酒吧,要了1.67杯酒。

一个测试程序员到了酒吧,要了1杯凳子。

一个测试程序员到了酒吧,要了(int)1.233杯酒。

一个测试程序员到了酒吧,要了static_cast<int>(‘1’)杯酒。

——Introducing 类型转换

C语言有两种类型转换,显式类型转换和隐式类型转换。


隐式类型转换

隐式类型转换是一种由编译器按照数据类型的转换规则自动转换,无需程序员干预的自动进行的类型转换。

例如:

int a = 1.6777;
int b = 'A';

第一种出现了一个情况,定义了变量a为整数型,但是在初始化的时候,却为它赋值一个浮点数1.6777。在这种情况下,变量a的值变成了1,它出现了精度损失,这便是隐式类型转换可能会出现的问题。

第二种情况,把一个字符赋值给了整数型的变量b,此时其实也是进行了一次转换,把char类型的字符‘A’的ASCII码65赋值给了b。但是这种情况下并没有出现精度损失。可见,隐式类型转换也不一定会损失精度。

以上是出现在赋值时的隐式类型转换。咱再来看看在运算时进行的隐式类型转换。

int a = 2.4 + 3.6 + 1;

这一句出现了两种类型转换。

先看等号右边,2.4和3.6都是浮点数,1作为整数要和他们进行运算,必须隐式地转换为浮点数的1.0(为方便表示,我将记作1.0),然后再与其它两个浮点数计算。计算出的结果为7.0,是浮点数。然后就是上文讲的赋值时的隐式类型转换,把7.0转换为7赋值给a。

事实上,在计算时总有这种规矩:

HIGH
  ↑
double ← float
  ↑
long
  ↑
unsigned 
  ↑
int ← char, short
  ↑
LOW  

从下往上的箭头表示在它们混合运算时总会先隐式转换到最高类型等级再进行运算,从右往左的运算则是无论它们有没有进行混合运算都会先隐式转换至最左边的类型,即:

不同类型数据的运算 ==> 结果的类型
int + long ==> long
int + double ==> double
char + char ==> int
char + short ==> int
unsigned + int ==> unsigned

事实上,运算时的隐式转换因为都是往表示范围更大的方向进行,所以一般不会出现精度损失(但是可能得到非预期解,如unsigned a = 1,a-2的值就不会是-1而是一个极大的unsigned类型的整数)。

因为诸如此类的可能出现的精度损失等问题,写程序的时候应该尽量避免隐式类型转换而尽量使用显式类型转换。

显式类型转换

C语言中,要进行显示类型转换十分简单,在你想转换的变量之前加上(数据类型)的结构。例如:

double a = 3.14; //定义了一个浮点型
printf("%d",(int)a); //把变量a强制转换为int类型的数值再打印出来

这边的(int)a,就是C语言的强制类型转换。这边括号内的内容可以换成任何你想要转换成的类型。

//C语言的强制类型转换没花头,很容易就会了

【注意:以下仅限C++

就讲一个效果和C语言的强制类型转换作用相同的:static_cast<数据类型>(数据)。

static_cast<> 静态类型转换 例如:

auto a = 3.14; //定义一个浮点数
auto b = static_cast<int> (a); //强制转换为整形
std::cout << b;

注意:static_cast的尖括号内的值需要在编译器期确定!

Little Tip:你可以使用decltype()来取得已经定义好的变量的类型,然后用来转换类型或者定义新变量。如:

auto a {1}; //定义a为整形
auto b {1.2}; //定义b为浮点型
decltype(a) c {3}; //利用a的类型(int型)来定义c
auto d = static_cast<decltype(a)>(b); 把b强制转换成a的类型去赋值给d

So much for this.这次的附录就结束了~

Python小白爬虫

老八蜜汁小蜘蛛,问君吃否

def bilispider():
    import urllib.request
    import re

    hds = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWe\
    bKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}
    request = urllib.request.Request(url='https://www.bilibili.com/',headers=hds)
    data = urllib.request.urlopen(request).read().decode('utf-8')
    ##html = urllib.request.urlopen(request)
    ##data = html.read().decode('utf-8')
    target = '"author":(.*?),'
    author = re.compile(target).findall(data)
    print(author)

这个程序本来是用于看看bili首页热评的一些up猪,不过由于bilibili的更新,已经没有可以爬的东西了

用到两个re库 和urllib库,需要自己加轮子

hds用字典表示请求头的一个元素。urllib.request.Request(url=’https://www.bilibili.com/’,headers=hds)

  • 用于返回一个请求,前一个参数为url,后一个为请求头

data = urllib.request.urlopen(request).read().decode(‘utf-8’)

  • 通过 urllib.request.urlopen(request).read().decode(‘utf-8’) 发送请求并读取返回值,最后再以utf-8解码,得到网页的html

target = ‘”author”:(.*?),’

  • 这是一个正则表达式,稍后介绍

author = re.compile(target).findall(data)

  • 通过re模块的compile函数匹配字符串data

最后输出结果

Python正则表达式的一些知识

通用字符

\w 匹配任意一个字母、数字、或下划线

\W 匹配除字母、数字和下划线的任意一个字符

\d 匹配任意一个十进制

\D匹配除十进制外的任意一个字符

\s匹配任意一个空白字符(个人表示奇怪,可能我不明吧什么是空白字符)

\S匹配除空字符以外的任意一个其他字符

原子表

[ ]取任意一个进行匹配

[^ ]匹配除方括号内的其他任意字符

元字符

.匹配除换行符以外的任意字符

^匹配字符串的开始位置

$匹配字符串结束位置

*匹配0次、1次或多次前面的原子

?匹配0次或1次前面的原子

+匹配1次或多次前面的原子

{n}前面的原子恰好出现n次

{n,m}前面的原子至少出现n次,至多m次

丨模式选择”python丨php”

()模式单元符 用于从一个语句中选择出要的东西

边界限制符

^匹配字符串的开始

$匹配字符串的结束

模式修正符

I匹配时忽略大小写

M多行匹配

L做本地化识别匹配

U根据Unicode字符及解析字符

S让‘.’匹配包括换行符,即用了该模式修正后‘.’就可以匹配任意字符了

贪婪模式

.* 尽可能多的匹配

懒惰模式

.*? 尽可能少的匹配

匹配一个网站

一种表示方法

开头是http://或者https://当然也可以是别的什么的

都是字母 所以可以以 [a-zA-Z]*:// 表示

中间有很多符号可以使用.*?表示

结尾为.com或者cn 使用[.com|.cn]表示

最后结果为: ‘ [a-zA-Z]*:// .*?com| [a-zA-Z]*:// .*?cn’

Dk的C/C++教程(3-1)【附录】命名规则与驼峰命名法

还在使用x,y,z,a,b,c等无意义字符做变量名嘛?还因为把变量命名位g,s,b而遭到同学的嘲笑嘛?还因为不知道怎么命名变量能做的更直观嘛?

——Introducing Camel-Case:驼峰命名法

我们现在先来看看一个例子:

假如我们想要定义一个变量存储我们的名字,该怎么命名呢?

mylastname

构成这个变量名的所有字母都通过小写被粗暴地整合在了一起,很难一眼看清,对吧?这种变量命名方法明显地降低了代码的可读性。要不,我们拆分一下单词?

my_last_mane

显而易见地,这个变量名的可读性比上面那种高了很多,我们可以轻易地读出它的各个单词并且很清楚地知道它的意思。但是很显然,这不够紧凑,我们还得多打两个字符(吐槽下这下划线真的不是很好按)。

驼峰命名法

驼峰命名法的命名规格极为形象,通过大小写像驼峰一样变换来实现单词的区分,更方便直观地表示变量名。

那我们来看看驼峰命名法该怎么用:

myLastName

相比于前两种,驼峰命名法既直观又紧凑,保证了代码可读性的同时也兼顾了效率。

驼峰命名法的规则是这样的: 当变量名或函数名是由多个单词连结在一起,构成的唯一识别字时,每一节个单词的首字母都采用大写来区分,单词与单词之间不额外添加下划线。

而以第一个单词的首字母是否要大写为区分,我们又可以分成大驼峰法和小驼峰法。

大驼峰法:

包括第一个单词在内的所有单词的首字母全部大写,如:

  • MyLastName
  • DataBaseUser

小驼峰法:

第一个单词的首字母不大写,其余每个单词的首字母均大写,如:

  • myLastName
  • studentsAverageGrades

驼峰命名法就介绍到这里。


接下来再讲讲我使用的一种命名规则。

强烈建议使用英文命名!!!

变量的命名规则

变量名的命名,首先应该是这个变量要储存的内容的英文意思。借助你强大的英文水平,先把你想好的中文变量名翻译成英文,不会的话就借助翻译软件吧。

然后,如果你翻译出来的内容仅由1个英文单词构成,请直接以这个单词的完全小写的形式命名这个变量。如果是由多个单词组成的词组,应该使用小驼峰法的方式为这个变量命名。 记住,它应该是个名词或者名词性词组。 例如:

salary,tax,carSum,taxRate;

特殊地,给布尔类型的变量命名,建议使用 is + 属性名的方法,依照具体的语境,也可以用can,have,should等前缀代替is,同样使用小驼峰法。同时要记得避免使用否定词。例如:

isReal,isHigh;(√)
isNotTall,isError;(×)

常量的命名规则

常量一般是指使用const关键字修饰定义的数据,有时也只使用预处理宏#define定义的数据。

使用const关键字定义的常量

它的命名规则和变量类似,但是要使用大驼峰法,即第一个单词的首字母也要大写。例如:

Line,SavingAccount,Pi;

使用#define关键字宏定义的常量

它的所有字母都应该采用大写,同时,若是由多个单词组成的变量名,为了区分每个单词,在每两个单词之间应该添加下划线。例如:

PI,MAX_SIZE;

函数/方法的命名规则

函数的名称应该是一个动词或者一个动词词组。如果函数名仅由单个单词构成,那么请以这个单词的完全小写形式命名这个函数。如果这个函数名是一个动词词组,请以小驼峰法的方式命名这个函数。例如:

getArea,setPath,takeSteps;

名字空间的命名规则(C++)

对于名字空间,请以一个英文单词完成对它的命名,而且,应该使用它的完全小写形式。例如:

model,common;

结构、类(C++)的命名规则

结构体和类的名称应该是一个名词或者名词性词组。若使用单个单词命名,请首字母大写;若使用词组,应使用大驼峰法命名。例如:

Node,SomeClass;

但是,命名结构和类形成的实例(结构体和对象)时,应该依照一般的变量的命名法进行命名。

对于枚举类型(以enum关键词声明)

同样建议使用名词或者名词性词组,以首字母大写或者大驼峰法命名。

而对于枚举类型的枚举常量,建议以全部大写字母+下划线分割单词的方式命名,同时应尽量使用共同的类型名作为前缀。

例如:

enum Color { COLOR_RED, COLOR_GREEN, COLOR_BLUE };
enum ColorType { COLOR_TYPE_WARM, COLOR_TYPE_COLD };

额外再提几个用于命名的关键字以及技巧,让代码更直观

  • get应该用在直接取得已设定值的函数中。
  • set应该用在直接为变量设定值的函数中。
  • compute应该用在用于进行计算的函数中。
  • find应该用在用于查找的函数中。
  • init/initialize应该使用在用于初始化的函数中。
  • 在需要标识序号的变量名中,使用No + 序号比较合适。
  • 布尔变量的命名应使用is,has等前缀,并且尽量避免否定词。
  • 循环变量建议设置为i,j,k,并且建议优先使用i而把j,k用于循环嵌套。
  • 对于缩略词我们有两种态度:1、对于那种缩写了人家可能就看不懂了的,比如cmd,init,请不要用缩写代替他们。2、对于那种缩写认识展开别人就看不懂的,比如HTML,CPU,老老实实写缩写。

另外,对于自己写的头文件的命名,推荐使用大驼峰命名法。例如

MyClass.h
CppFunction.h

OK,有关命名方法先写这么多。

Dk的C/C++教程(3)数据类型与变量

——程序员为什么分不清圣诞节和万圣节?

——废话,Oct31=Dec25啊。

这一节,咱来看看C语言众多的数据类型。


整数类型

int类型

int类型是有符号的整数类型,这说明int类型数据必须是整数,可以是正数、0、负数。但是对于不同的计算机,int类型的可表示范围不一样。在32位环境中,int类型数值使用32位空间存储,int作为一个有符号位的数值,它的存储范围为 -2147483648~2147483647(-2^31 ~ 2^31-1)。

short类型

short类型是相对int占用空间更小的整数类型,一般用在较小数值处来节省空间。与int类似,它是有符号类型。在32位环境中,short类型数值使用16位存储空间,它的存储范围为-32768~32767(-2^15 ~ 2^15-1)。

long int类型(或者简称long类型)

long类型是相对int占用空间更大的整数类型,一般称为长整型。常用在使用较大数值处。long类型同样也是有符号类型。它占用的存储空间可能比int类型更多。

long long int类型(或者简称long long类型)

long long类型于C99标准加入,能表示的数值比long int更大,适用于更大数值的场合。它也是有符号类型。该类型在32位系统中使用64位存储空间,它的存储范围为 -9223372036854775808~9223372036854775807(-2^63 ~ 2^63)。

unsigned int类型(或者简称unsigned类型)

unsigned类型是一种无符号类型,只允许用于非负数的场合,它的表示方法与int类型略有不同。因为没有了符号位,它现在可以表示更大的整数。在32位环境中,unsigned与int一样使用32位存储空间,但其存储范围为0~4294967295(0 ~ 2^32-1)。

其它的unsigned

在C90标准中新添加了unsigned long int (unsigned long)类型和unsigned short类型。C99标准中新添加了unsigned long long int (unsigned long long)类型。它们的运用和unsigned int类似,此处不过多赘述。

字符类型

char类型

char类型用于存储字符,比如大小写字母,符号,数字,不可见字符等。但是实际上,它是通过存储字符的ASCII码来存储字符的,所以从技术层面上看,char类型实际上存储的也是整形。例如,存储字母A实际上存储的是A的ASCII码65。ASCII码的范围为0~127,最少只需7位二进制数据即可表示。但一般上char类型计算机都以8位的存储空间(即一个字节)来表示。但是ASCII仅收录了英文字母和其他标点符号。对于汉字,我们用GB2312规范了计算机的汉字表示,使用2个字节来定位表示不同的汉字。因此,要想在计算机中存储一个汉字,你需要至少2个字节的存储空间。

浮点数类型

float类型

float类型又被称为单精度浮点型,是有符号数。它可以存储带有小数部分的数据。在32位环境中,float类型使用32位的存储空间,它的精度大概为6~7位有效数字。

double类型

double类型又被称为双精度浮点型,也是有符号数。它的精度相比float类型更高。在32位环境中,double类型使用64位的存储空间,它的有效数字位数能达到15~16位。

long double类型

long double类型比double类型还要猛,它的精度更高。 同样它是有符号数。在32位环境中,long double类型使用128位的存储空间,它的有效数字位数能达到18~19位。

bool类型(声明在stdbool.h中)

bool类型,或者布尔类型,用来表示真假值,表示true和false。C语言用1表示true,用0表示false。bool类型其实是无符号的int类型,它所占用的空间其实只要能存放0或者1就可以了。

其实,C语言还有面向复数和虚数的数据类型_Complex和_Imaginary,这边先不赘述了。

Tips

  • 想知道你的电脑的环境上每种变量占用的存储空间的大小嘛?使用C语言的内建函数sizeof();即可。它的返回值是一个int类型的数据,值是对应类型的存储空间大小,以字节为单位。8位(bit) = 1字节(Byte/B)。给个例子:
printf("%d",sizeof(int)); //输出1个int类型所占的字节数。

关于printf的相关参数,我们在输出篇再介绍。

尝试以下把int换成其它数据类型,看看输出的都是多少吧。


变量

变量,就是在程序中可以改变值的数据。

定义变量

变量的定义方法十分简单,按照以下格式即可:

类型名 变量名;

变量名的命名有几条基本规则

  1. 必须由数字,大小写英文字母以及下划线组成
  2. 不能以数字开头
  3. 不能和C/C++内置保留关键字重名,如int,double等。

(详细的命名规则将在后续补充。)

例如

int num; //把num定义为一个整数类型的变量。
char str; //把str定义为一个字符类型的变量。
float cake; //把cake定义为一个单精度浮点型变量。
bool isReal; //把isReal定义为一个布尔类型的变量。

其实,这边的定义是“定义+声明”合二为一了。因为此操作不仅像编译器声明了程序中接下来可能使用到的变量,而且在内存中已经为它分配了空间。

按照上面的方法,你就得到了你想要的变量了。

初始化变量

初始化变量其实就是在定义变量的时候给它赋初值。格式如下:

类型名 变量名 = 初值;

例如

int num = 3; //把3作为初值赋值给num。
char str = 'c'; //把'c'作为初值赋值给str,C语言中单引号包围的代表单个字符。
float cake = 2.33; //把2.33作为初值赋值给cake。
bool isReal = true; //把true作为初值赋值给isReal。

如果不给变量初始化,那么变量内存储的数据很可能是乱码(当然也有编译器会帮你初始化为默认值),这对程序的进行可能产生干扰。因此我在这里推荐,定义变量的时候应当尽量初始化变量。

改变变量的值

变量变量,那必须得会变。咋变叻?这里运用了一个运算符,叫赋值运算符’=’

变量名 = 值;

赋值运算符可以把它右边的值赋给左边。

需要注意:

  • 赋值运算符的左边必须是“可被改变的左值”,什么意思呢,就是左边必须要是一个变量(它的值可以改变)而不能是一个常量或者表达式(表达式有一个唯一确定的值)。
  • (值得注意的是,变量既可以做左值也可以做右值)
  • 例如:int a = 5;的情况下
  • a = 3; //合法,将a的值重新赋值为3。
  • 3 = a; //不合法,3是个常量,不能被赋值。
  • a + 2 =3; //不合法,赋值运算符左边是一个表达式,不能被赋值。

注意,以下针对C++学习者:

C++新增了类型推导功能,使用auto关键字可以根据定义时给定的初值来推定变量的类型。

例如:

auto a = 1; //a的初值为1,自动推导为int类型。
auto b(1.3); //b的初值为1.3,自动推导为double类型。
             //此初始化方式在C++11中使用,现已不再推荐。
auto c{'c'}; //c的初值为'c',自动推导为char类型。
             //此初始化方式在C++11中被引入,为列表初始化,建议使用。

因为使用auto关键字定义变量必须赋初值否则会报错,因此我建议C++定义新变量的时候尽量使用auto进行。

使用大括号的初始化方式为列表初始化,具有防止数据窄化(Narrowing)的功能,更推荐使用。关于数据窄化,将在之后的类型转换篇详细介绍。


那么这一节就先到这里了,下一节我们来讲讲运算符与优先级的问题。

Dk的C/C++教程(2)Aloha World!

“Aloha!”是夏威夷俚语里的问候语,那么多编程教程写的都是”Hello World”,咱来整点不一样的~

先来看一段代码吧~

#include <stdio.h>
int main()
{
    printf("Aloha World!"); //你好,世界
    return 0;
}

把它写在编辑器里,再保存为后缀名为.c的文件,它就是C语言源代码的文件啦

咱先不来编译运行它,咱来逐行分析这段代码:

  • 第一行:include的意思是包括,它把一个名字叫stdio.h的头文件包括进来了。stdio,我们把它展开一点,就是Standard I/O,I/O就是input/output的意思。.h,是C语言库文件的后缀名。综合来看,这一行的意思就是把C语言的标准输入输出库包含到了这个C语言源文件内。它之下的代码便可以使用stdio.h中提到的各种函数等事先定义好的内容。
  • 第二行:这是C语言运行的起点,main函数的第一行。main是个特殊的函数,C语言的代码都是从main函数开始运行的。前面的int代表的是main函数的返回值类型,int代表整数型。特别说明,依照最新的C11标准,main函数的返回值类型必须是int类型。之后的括号是main函数的参数列表,这边不给main函数设置参数,所以留空。有时,你也会见到参数列表中写明关键字void,它等同于参数列表里面啥也不写。
  • 第三行和第六行是一对花括号,它框定了一个程序块,块中的代码即为main函数的函数体。
  • 第四行我们可以看到一个函数,叫printf,为了方便记忆,我们把它展开以下,就是print-function,就是“打印函数”,它是预先在库文件stdio.h内定义的C语言自带函数,直接就可以拿来用,用途是向当前控制台打印出字符。那么我们看这个函数的参数列表,只有一个元素,就是被双引号包围的一句话”Aloha World!”。在C语言中,被双引号包围的字符被称为字符串。相信嘤文好的读者肯定已经猜到这句话的作用了(\( ̄︶ ̄*\)),我们先不说破。
  • 第四行有一串额外的东西,//后面跟着的字符,代表的是这一行的注释,编译器读到两个斜杠之后,便会忽视之后的内容了。换句话说,编译器不会编译被注释的内容。
  • 第五行我们终于知道返回值在说个啥了。返回值返回值,就是return value嘛,这个return语句的作用,就是把后面的0,返回到函数调用的地方去。注意,这个0就是int类型的数据了。但是,main函数有点特殊,在main函数完成return操作之后,该C语言程序就会自动关闭了。也就是说,在这个C语言程序中,没有东西能调用得了main函数,那么它是做什么用的呢?当main函数返回0的时候,它告诉操作系统,这个程序已经运行完毕并安全退出了,如果遇到运行时错误,程序还没有来得及运行到return语句就被迫中止,main函数就会返回一个非0的数给操作系统,告诉它这个软件异常退出了。因此,这个return语句显得格外重要。

那么大家看到这里,一定已经知道了这段代码的作用:往当前窗口打印(即输出)一串字符串:Aloha World!

那么我们要怎么编译这段代码才能让它成为一个能被操作系统运行的程序呢?以Windows环境为例,先把上面的那段代码用你的代码编辑器(比如VSCode或者甚至记事本)保存为.c文件(姑且假设为Aloha.c),然后在你存放这个源代码文件的文件夹的空白处,按住键盘上的Shift键并单击右键,选择“在此处打开Powershell 窗口”项,然后在窗口内输入

gcc Aloha.c -o Aloha

我们来解释一下,gcc是调用C语言编译器的命令,后面跟着的Aloha.c是我们写好的C语言源代码文件,代表要把Aloha.c的代码编译成可执行文件(就是我们能运行的软件)。后面的-o 参数,代表编译生成的可执行文件的名字。当我们按下回车之后,你可以看到在当前文件夹下多了一个Aloha.exe文件,它就是我们编译出的程序。

那么既然我们已经成功编译好了源代码,现在就来运行一下我们的程序看看。继续在Powershell窗口输入

.\Aloha.exe

看到了嘛,它下面就输出了我们刚刚分析完的Aloha World!

这就是你的第一个C语言程序。

(对于配置好VSCode的读者,在你写完代码并且保存好之后,你只需要单击Code Runner的运行按钮,源代码的编译以及编译完的程序的运行都会一次性地完成,你可以直接看到输出结果。)

以下为针对注释的补充材料:

//这是行注释
/*
这是块注释
*/

编译器将会忽视注释内的一切东西。注释只是方便代码的阅读者的理解。换言之,一般的代码的阅读者是计算机,但是注释的阅读者是程序员。

注意:以下针对C++学习者

任何合法的C语言代码都是合法的C++语言代码。要想输出”Aloha World”,除了利用上面提供的函数输出方法,C++还提供了流式输出方法,请看代码:

#include <iostream>
int main()
{
    std::cout << "Aloha World!";
    return 0;
}

有几个不同点:

  1. 第一行包含的头文件,不在是stdio.h而是iostream.h了,在新标准的C++中,头文件的后缀名变得“可以省略”了。iostream是C++的流式输入输出库,提供了全新的流输入输出方式。
  2. 第五行不再使用函数而是使用std名字空间下的C++标准输出流来实现字符串的输出了(有关名字空间的概念,我将在讲解变量作用域的地方详细解释)。”<<“为流插入运算符,他能把后面的字符串插入到前面的cout标准输出流中,使后面的字符串能够输出在控制台上。

请注意:

  • C++的源代码文件,后缀名应该为.cpp
  • C++代码的编译器,应该使用g++而非gcc

如此,你就得到了你的第一个C++程序,程序的效果和C语言版一致。

最后的运行效果都是一样的,如下图:

Okay,那么这一章就到这里了。

Good luck,and good night~

Dk的C/C++教程(1)配置编译环境啦

本节来讲讲怎么在本地配置C/C++编译环境,还是以三大桌面操作系统加以区分。

Windows环境

C/C++的编译环境搭建,可以参考我之前在本站的文章《从0开始配置Visual Studio Code的C/C++编译环境》来配置MinGW提供的环境。本文中使用的编译器均为gcc,文本编辑器为VSCode,IDE为CLion。

Linux环境(以Ubuntu为例)

如果你用的是Ubuntu Linux(其他发行版也大同小异),可以在命令行中输入

sudo apt-get install build-essential
sudo apt-get install gdb

来安装编译器和调试器。

macOS环境

如果你用的是macOS,更简单,去Mac App Store下载安装苹果的开发套件Xcode就可以正常使用了。

总之,当你在命令行窗口中输入gcc -v的时候能正确显示版本号和gcc的相关讯息时,你就算安装成功了(如下图所示,终端为Windows Terminal)。

Dk的C/C++教程(0) First Thing First

授人以渔,且温故而知新矣。

先说最实在的,基础需求

最好对计算机系统有一定了解和认识吧。没有基础也没有任何关系,活用搜索引擎进行搜索,真的可以学到很多,碰到不清楚的东西,复制下来去百度或者谷歌上搜索吧,一般都能得到很好的解答。在此推荐两个站点,一个是国外的StacksOverFlow,一个是国内的CSDN,几乎所有的问题都能在上面找到答案(就是CSDN有的时候有抄袭的现象然后一篇错的东西可能你抄我我抄你搞得就到处都是了( ̄_ ̄|||))。

另外,咱最好有一点命令行预备知识,在此援引feather大佬的python教程中的命令行基本操作:python教程(一)·命令行基本操作

来一手大♂纲

一、起步!
  • 1.配置编译环境
  • 2.Aloha World!
  • 3.数据类型与变量
  • 4.运算符与优先级

二、入门啦

  • 1.输出!
  • 2.输入!
  • 3.基本的控制语句

(这个大纲我会随着我写的进度不断的加入)

如果你是小白,而且有兴趣看我的博客的话,请不遗余力地来催更吧。作者的e-Mail:work_alfred_wang@aliyun.com,欢迎各路大佬和小白一起交流( ̄▽ ̄)”!

From 永远不咕的Dk

WP传输大文件,听音乐

00:00/00:00

传大文件

修改了.htaccess ,根目录增加了php.ini,对于传输文件大小没什么用。已经改回

找得到.htaccess找不到php.ini。自己在根目录创建了php.ini但是没啥用。总结:以上于我无用。

于是乎我在咕勾上瞎逛,找到一个很好的插件 add from server

https://pan.baidu.com/s/1cTe34Hs8BsMo3l5iJiWT2g     提取码knj5

可以从插件目录下导入文件

于是乎我在插件目录下建立了一个music/  然后通过添加媒体即可播放。

Hermit使用指导

网易云音乐

网易云音乐的地址可以通过

得到连接,再在添加音乐中输入连接即可。我爱网易云。

  • 单曲地址格式:http://music.163.com/#/songid=28031119
    http://music.163.com/#/songid=28288476可以定义多首歌曲,一行一首,会过滤重复地址
  • 专辑地址格式:http://music.163.com/#/albumid=2715905
  • 歌单地址格式:http://music.163.com/#/playlistid=8702279
虾米音乐

直接添加地址即可,不过选择虾米音乐之后记得音乐地址的格式是有要求的,不然不会亮按钮。地址也可以通过分享里面的连接得到。但是虾米音乐可能做了什么手脚,播放音乐不能,烦恼相当。

00:00/00:00

  • 单曲地址格式:http://www.xiami.com/song/1772276934
    http://www.xiami.com/song/1772276934spm=a1z1s.6659513.0.0.CNqWT9可以定义多首歌曲,一行一首,会过滤重复地址
  • 专辑地址格式:http://www.xiami.com/album/1482417245spm=a1z1s.6843761.1110925389.8.fPssn5
  • 精选集地址格式:http://www.xiami.com/collect/27433968spm=a1z1s.3065917.6862697.18.Jn8JNx

从0开始配置Visual Studio Code的C/C++编译环境

在我发现Visual Studio Code(以下简称VSCode)的Settings Sync插件之前,每次配置VSCode都要了我的老命……(Dk的原话)

1.配置编译器

First thing first,要写代码,必须得先安装对应语言的编译器。那么在Windows环境下,我们使用MinGW-w64提供的GCC编译器。

首先去MinGW官网(下载地址:https://osdn.net/projects/mingw/releases/)下载对应的Windows版本的mingw-get-setup.exe,按照提示安装MinGW Installer,在Basic Setup里面选择除了mingw32-gcc-ada-bin和mingw32-gcc-fortran-bin,然后点击左上角的Installation,选择Apply Changes,然后等待它完成下载安装,中途可能会因网络等原因导致多次错误,直接关闭提示就好。

然后去配置环境变量:MinGW的默认安装位置是C盘根目录下的MinGW文件夹,该文件夹下面有个bin文件夹,复制该文件夹的地址然后添加到系统环境变量的Path内(Win10系统下环境变量配置的入口在:桌面-此电脑(右键)-属性-(左边的)高级系统设置)。在命令行内输入gcc -v如果正确显示了版本号说明目前为止的编译器配置已经成功了。

2.安装VSCode

没啥好说的,认识汉字就能装了,记得勾选“把 Open With Code 添加到右键菜单”选上,我觉得还挺好用的一个功能。

3.来配置吧

    1)安装插件

x话少说,打开是英文界面的先装Chinese Simplified插件(插件菜单在左边,叫 Extensions)。

主要是以下3个插件:Code Runner,C/C++,Pretty-Code Formatter。

对于某些经常打错字的(比如main => mian)这种,另外推荐一个插件叫 Code Spell Check,有效防止拼写错误。

    2)配置插件Code Runner

剩下几个插件都是开箱即用的(装完Prettier之后利用Shift + Alt +F快捷键可以快速对齐代码,贼拉好用!),这边只说Code Runner。

首先Code Runner的输出默认是在VSCode的输出窗口,不能输入。但是写程序也难以避免无输入的情况,因此需要先去设置(入口为:(左上角)文件-首选项-设置)搜索一个选项叫 Run In Terminal(在终端中运行),给它打上钩。

其实这样已经可以正常跑C/C++代码了。但是为了体验到最新的标准,我们还是应该给Code Runner 配置一些参数。

咱打开设置里的settings.json,在内大括号里加两行(最好加在头上)

"code-runner.executorMap": {     "cpp": "cd $dir && g++ -std=c++17 $fileName -o $fileNameWithoutExt.exe && ./$fileNameWithoutExt.exe",   "c":"cd $dir && gcc -std=c11 $fileName -o $fileNameWithoutExt.exe && ./$fileNameWithoutExt.exe"     },

看到参数那边的-std=c++17 和 -std=c11了嘛,以后编译出来的程序就是符合C++17和C11标准的了!

那么至此,你的VSCode已经可以正常编写C/C++代码了。只需要新建一个文件夹,然后右键其中,选择“用 Code 打开”或者“Open With Code”,再新建源代码文件,你就可以愉悦的肆意编写代码了。写个Aloha World,向世界问好吧!

一不小心就初始化了服务器,我们从零开始!!!

珍藏许久的音乐,以下内容配音乐食用更加。

整服务器(loading.*.*.*.*.*.)

本文内容从以下几个博客,网站学习而来,感谢(flower

https://www.cnblogs.com/cookiewu/p/9664062.html                   配置ssh

https://blog.csdn.net/dreams_deng/article/details/78968416        免密ssh

https://zhuanlan.zhihu.com/p/48872802               搭建服务器,网站

https://www.jianshu.com/p/0f2fb935a9a1           有关vscode-remote


SSH部分:

对于linux服务器,ssh是必不可少的工具之一。

1.安装ssh服务端               

2.确认sshserver是否启动了        ps -e | grep ssh

3.启动sshserver                          /etc/init.d/ssh start

4.SSH配置(如果需要) 修改配置文件/etc/ssh/sshd_config,这里可以定义SSH的服务端口,默认端口是22,你可以自己定义成其他端口号如32,然后重启服务

5.重启sshserver                          /etc/init.d/ssh restart

客户端可以直接使用openssh 或者 xshell 当然也可以使用vscode的插件等等

6.为了更加方便,可以使用免密登陆的方式,使用如下命令产生公钥和私钥,把公钥拷贝到linxu文档中的【/home/(user)/.ssh/authorized_keys】中即可免密连接对应账户。

                          客户端:               ssh-keygen -t rsa

  1. 服务端:                                mkdir .ssh

                                                         vim authorized_keys

可能使用到ps:用于传输文件          scp id_rsa.pub user@(ip):(dictionary) 

  1.                                      cat id_rsa.pub >>/root/.ssh/authorized_keys

                                                     chmod 600 authorized_keys

  1. 修改服务器端ssh配置文件:             cd /etc/ssh

                                                     vim sshd_config

  1. RSAAuthentication yes (开启rsa验证)

PubkeyAuthentication yes (是否使用公钥)

AuthorizedKeysFile /home/user/.ssh/authorized_keys  (公钥保存位置)

PasswordAuthentication no  (禁止使用密码登录)       (这个没什么必要)

11.最后                         service sshd restart


ubuntu lamp安装环境搭建部分:

1.系统升级和更新源                  sudo apt-get update

                                                    sudo apt-get upgrade

2.配置apache2                      apt-get install apache2 -y

在自己使用的电脑打开浏览器输入http://<云主机 IP 地址>,查看到 “it works” 界面,说明ok

3.安装php组件                     sudo apt-get install php -y(原文都是使用php7.0,但是好像会出错)

安装 php 相关组件:               sudo apt-get install libapache2-mod-php

4.安装mysql数据库                  sudo apt-get install mysql-server -y

安装php mysql相关组件:          sudo apt-get install php-mysql

5.安装phpmyadmin

使用 apt-get 安装 phpmyadmin,安装过程中,您需要根据提示选择 apache2 ,再输入root密码 和数据库密码:      sudo apt-get install phpmyadmin -y

6.建立 /var/www/html 下的软连接:(使得mysql和phpmyadmin文件链接起来使得在www文件加下的文件可以直接被访问)

sudo ln -s /usr/share/phpmyadmin /var/www/html/phpMyAdmin

7.重启mysql 和apache2               sudo service mysql restart

                                                 sudo systemctl restart apache2.service

8.下载wordpress(我也不知道为什么这个网站居然被和谐了,所以我自己提取了放在网盘里面,需要自取)可以使用wget(you need magic) 也可以使用scp传到linux

   https://pan.baidu.com/s/1JPkgfZLZFljtQOH1gTutqA  提取码:wogc

  1. 解压wordpress安装包 sudo unzip wordpress-4.7.4-zh_CN.zip
  2. 为wordpress 配置一个数据库,进入 mysql,输入以下代码后,按提示输入您MySQL密码:                  mysql -u root -p

11.为 wordpress 创建一个叫 wordpress 的数据库

                                       CREATE DATABASE wordpress;(不要漏分号哦)

12.为这个数据库设置一个用户为 wpuser:(用户名可自定义,但一定要记住)

                                        CREATE USER wpuser;

13.为这个用户配置一个密码为 mykey:(备注:密码可自定义,但一定要记住)

          SET PASSWORD FOR wordpressuser= PASSWORD(“mykey″);

14.为这个用户配置数据库的访问权限:    GRANT ALL PRIVILEGES ON wordpress.* TO wpuser IDENTIFIED BY”mykey”;  (备注:如果用户名和密码是自定义,则wpuser和wp123123改成自定义的)

15.生效这些配置                          FLUSH PRIVILEGES;

16.然后退出 mysql                       exit;

17.由于PHP默认访问 /var/www/html/ 文件夹,所以我们需要把 wordpress 文件夹里的文件都复制到 /var/www/html/ 文件夹

                                                sudo mv wordpress/* /var/www/html/

18.修改一下 /var/www/html/ 目录权限:

                                                sudo chmod -R 777 /var/www/html/

19.将apache指定到index.html

sudo mv /var/www/html/index.html /var/www/html/index~.html

20.重启 Apache 服务:

                                             sudo systemctl restart apache2.service

21.可以登录你的ip啦

22.因为技艺不精,对FTP用户什么的不是很明白,然后又因为这个原因装不了新版的主题。插件之类的东西。

对此有两种方法

第一种,如果我们安装的是lnmp一键安装包,那可以使用。授权组来解决。

chown -R www /home/wwwroot/http://www.yxlgh.com                                   (修改成网站域名目录)

第二种,如果是其他的可以使用在wp-config.php文件中添加脚本方式。

define(“FS_METHOD”,”direct”);

define(“FS_CHMOD_DIR”, 0777);

define(“FS_CHMOD_FILE”, 0777);

第二种亲测可以,但是确实有点小问题,可能和wall有关?。还是我太菜了(sad