目录
一、常量
分类:字面常量,#define修饰的常量,const修饰的常量,枚举常量。字面常量也就是我们很熟悉的常量,比如5,g,这些都是常量,无法被改变,可以直接写出来。之前的int a = 5,a就是变量,可以被赋值5。
const修饰的常量
int main()
{
int num = 1;
printf("%d\n", num);
num = 19;
printf("%d\n", num);
return 0;
}
运行后可以打印出1和19两个数字。num先被赋值为1,后又改为19.现在在int num前加上const,
const int num = 1; const的意义就是常属性。当加上const后,num的值就不能被改变了,const给num加上了常属性,虽然它是变量,但是却有常数的性质,所以num此时叫常变量。再次运行程序,编译器会报错,因为有常属性,就不允许修改。虽然const给了变量常属性,但是变量还是变量,并不是常量。
#define定义的标识符常量
#define MAX 10
int main()
{
int arr[MAX] = { 0 };
printf("%d\n", MAX);
return 0;
}
运行起来,可以发现打印出10。如果:
const int a = 10;
int arr[a] = {0};
此时就会出错。而define则可以。
这里的[a]是表示一个数组,这个后面再写。定义数组的时候可以写上这个数组要有多少个元素,10就是10个元素,这里的例子说明[]里填充的表示个数的数字不能是变量,但也有变长数组可以这样。关于数组的描述,以及下文中也有的描述,可以不用理解,之后会有专门说明数组的博客。
枚举常量
枚举要用到enum关键字。
enum Sex
{
Female,
Male,
Secret
}; //这个分号必须有。这三个值就是枚举常量。
int main()
{
enum Sex s = Female;
printf("%d\n", Female);
printf("%d\n", Male);
printf("%d\n", Secret);
return 0;
}
运行起来,会打出0,1,2这三个数字。这三个词是有数值的且不可被改变,0,1,2。这三个数从0开始,并且是递增的,注意这个并且,是两个性质,如果Female设为200,在enum中写上Female = 200, 那么就打印200,201,202;如果Male设为200,那就0,200,201。
二、字符串+转义字符+注释
字符串
字符串是由双引号引起的一串字符,其结束标志是\0,计算字符串长度的时候\0不计入,它不是字符串内容,写的时候也不用写\0。比如"asdasdasd","1231235452","z"都是字符串 。字符串的存储可以用数组来存储,数组就是一组数。
char arr1[] = "abc";
printf("%s\n", arr1);
return 0;
这样打印出的结果就是abc。如果:
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a', 'b', 'c' };
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
结果是abc 和abc...bc,省略号会出现随机字。为什么就出现这种情况?第一种以字符串形式呈现,第二种是三个字符呈现。那么为什么会有不同?第一种的具体内容其实是三个字符加上结束标志\0,\0的值是0,所以如果给第二个后面再写一个0,那么显示结果就一样了。arr2在读取时,会一直找到\0才停止,而在我们可以看到的,可以定义的字符中只有abc三个字符,所以后面是什么我们也不知道,这里会涉及到内存相关的知识,现在只需要知道后面的东西是计算机自己存储的数据,我们把它当作随机值即可。我们既可以写成'\0',也可以直接写0,读取数组内容读取到c时就停了,就不会有其他的东西了。 \0是隐藏的。
\0有数值,其他字符自然也有数值。'a'的值为97,'A'的值为65,像#¥这些也都有自己的值,这里牵扯到ANCII 编码,ANCII码值。可以收藏这个
ANSCII码表_ansicc码表_free(me)的博客-CSDN博客https://blog.csdn.net/weixin_43772611/article/details/123134850
我们还可以更具体的看刚才代码中字符串的长度。
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a', 'b', 'c' };
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
return 0;
}
strlen——string length 用于计算字符串长度。刚才提到了,\0在求字符串长度时不进入计算过程。
运行的结果是3和随机值。第一种具体写为a b c \0,第二种是a b c ...后面全为随机值,直到遇到一个随机值0,才能停止,所以我们手动在c后给一个0或者'\0'才能和第一种一样,如果写'0'则没有作用,因为这个就是一个普通的字符,不代表字符串停止符\0。
转义字符、
\0就是一种转义字符。这里要具体说一下转义字符。
printf("abcn");
这样的结果就是abcn,如果在n前加上转义符号\,变成abc\n,那么结果就是abc,然后切到下一行。\n是换行转义字符,输出完后就换行。让我们看这样一个代码。
printf("c:\test\32\test.c");
结果会是c: est一个向右的箭头 。这很奇怪,并没有打出相应的字符串。t是一个正常的字符,但是\t就是一个转义字符了,\t是一个水平指表符,它会打印出一块空白,其实就是一个水平制表符(四个空格)这样长度的一个空格。水平制表符并不重要,重点在于转义字符。给一些转义字符:
\? 在书写连续多个问号时使用,防止它们被解析成三字母词。
\' 用于表示字符常量或者说字符’
\" 用于表示一个字符串内部的双引号
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符
\a 警告字符,蜂鸣
\b 退格符
\f 进纸符
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\ddd ddd表示1~3个八进制的数字。如\130x
\xdd dd表示2个十六进制数字。如\x30 0
\?是一个老旧C语言的字符,连续两个问号后加上一个字符,它就会转换成任意一个其他的字符,而不是原本程序员想输出的内容,这也就是出现了三字母词。如果在两个字母前分别加上\,则可以正常打印内容,这个无需在意。
再看之前的程序,由于转义字符的存在,结果打印出错。我们可以在\前再加\一个,这样形成一个\\,作用在上面,这样就可以防止内容被转义,也就是这样的代码:c:\\test\\32\\test.c,于是 c:\test\32\test.c 就可以打印出来了。这就是转义字符。
再说一下其他的转义字符。\':如果我们还想打印',那么printf("%c\n", '''); 这样会出错。编译器解析的时候会把前两个当成一对,而第三个'则落空,所以会形成一个空字符常量。在中间的'前加上\,这样就是’ \' ',那么这样就可以正常打印出'了。%c打印字符,%s打印字符串。刚才是字符,那么字符串也一样:printf("%s\n", "\"")这样才能打印正确。
printf("%d\n", strlen("c:\test\32\test.c"));
结果出来是13。\t是算一个字符,\32也算一个。\32其实际上,32是两个八进制数字,\32是32这两个八进制数字转换成十进制数字后这个十进制数字就是一个ANCII码值,这个值对应的字符,注意读作三二,而不是三十二。我们只打印一下\32,printf("%c\n", '\32'); 会得出一个向右的箭头,就是之前所说的打印结果中出现的箭头。具体ANCII码值可以自行搜索。
同样,\xdd也是如此,比如printf("%c\n", '\x61'),也能找到对应的符号。
注释、
注释是给人看的,对于程序本身没有什么作用,只是在给程序员解释一下这行代码要做的事。另一方面,有些代码不需要执行时,也可以注释掉,程序就会自动跳过这些代码。在C语言中,/* ........ */ 这是注释的形式。以/*开始,以*/结束,只要遇到*/,注释就结束,这个可以注释掉很多内容;单行注释就用//,会把它之后的一行的内容注释掉。注释在整个项目中很重要,别人读你的代码时也要参考注释,不过像现在所学,注释就没有多少作用,学到一定水平后,代码逐渐复杂,学习的内容逐渐变难,写的程序逐渐专业,注释不仅可以帮助别人读代码,也可以帮助自己整理思路。
三、选择语句
选择语句是C语言中很常用的语句,也很重要。选择语句顾名思义,重在选择,通过给定一些条件代码,来让计算机自己做选择。选择语句在之后的学习中也很重要。学到后期会发现,很多程序都是靠着条件来控制的,不仅仅是循环语句上的条件,单纯的条件也可以实现让程序自动化的需求。
if,while语句
int line = 0;
while (line < 20)
{
printf("asdasd\n");
line++;
}
printf("xcz\n");
return 0;
程序的顺序是声明一个变量line,给了一个line<20的条件,计算机会自己判断line是否符合条件,符合条件,就会打印出asdasd,然后line++的意思就是line加1,然后再次进入while循环,再次判断。当某次line为20时,不再符合条件了,那么此时跳出循环打印出xcz,然后程序结束。这样的结果就是,会出现20次asdasd,然后最后一行出现xcz。可是这个程序还不够严谨,除此之外,我们还可以再加上对循环次数的监视,让他每次循环都表示出这是第几次。
int line = 0;
while (line < 20)
{
printf("asdasd: %d\n", line);
line++;
}
if (line >= 20)
printf("xcz\n");
asdasd冒号右面以十进制常数呈现,数字存储在line里。这样就能显示出每一行是第几次循环。这里按照人的思路,应当第一次出现asdasd: 1,但是现在这样写就会出现0,把line++放在printf前面就可以。while语句的格式就是:
expr1;
while(expr2)
expr3;
expr为表达式。
if-else语句
if,else,其意为如果;其他,否则。其形式为:
if(expr1)
statement1;
else
statement2;
这里还要引入一个
else if(expr2)
statement3;
.....
else if就是再给一个判断。举一个例子:
int ag = 7;
int main()
{
if(ag >= 8)
printf("asd\n");
else if (ag <= 6)
printf("qwe\n");
else
printf("zxc\n");
}
给ag赋值7,然后进入程序,判断条件,由于ag均不符合两个条件,所以打印出zxc,从第一个开始,自上而下依次判断,这个特性在一些复杂的条件控制中起到关键性作用,学到数据结构时会发现这点。
for语句
for语句与while语句可以同时比较。其形式为for(expr1;expr2;expr3)expr1执行赋值,expr2执行测试判断,expr3增加存储值。expr3是循环体完成的最后一件事,比如:
int h = 0;
int sum = 0;
int main()
{
for (h = 1; h <= 47; h++)
sum += h;
if (h = 48)
printf("%d\n", sum);
return 0;
}
进入程序后,原先被赋值为0的h,现在被赋值为1,所以第一个就是一个赋值语句;然后判断h <= 47,接着就往下走,遇到sum += h,这行代码的意思为sum = sum + h,把sum + h的值赋值给sum,之后再往上走,执行语句h++,h++的意思为h+1。第二次循环,h为2,仍然符合判断条件<=47,新的sum等于原sum值加新h值,也就是1 + 2,也就是sum + h1 + h2,那么循环下来,sum就把所有的h值都加在了一起,也就算出来了1加到47的和。之后h为48时,判断不正确,为零。C语言中,只有非零和零,分别为真和假,于是来到if语句,此时h一定等于48,因为h为整数,47再加1后就是48,所以打印出sum值。其实不加if语句也可以,只是出于严谨而已。for语句在C语言中是应用很广泛的语句,因为相对于while来讲,for语句只需写出一行即可展示所有表达式,并且视觉上看起来很简洁。但做题的时候,while里会更加自由,这个在自己的做题中会逐渐感受到。
这里插入一条,在C语言中,=与==不一样,可以注意到,之前涉及到=的时候,我一直写的是赋值,而不是等于。=是赋值,==是等于,赋值的意思是把右边表达式的结果给左边的变量,而等于就是数学意义上的等于,所以=与==不相同,如果在刚才for语句例子里用==,那么就会出错,并且也解释不通。
循环语句还有do-while语句,之后的记录中会有更详细的关于循环语句以及do-while语句的说明。
结束。