1.转义字符
在 C 语言中,用双引号括起来的内容我们称之为字符串,也就是我们平时所说的文本。字符串可以由可见字符和转义字符组成。
而你如果想将一个字符串分为两行来显示,那么你就需要使用到转义字符。
转义字符一般是表示特殊含义的非可见字符,以反斜杠开头:
但反斜杠如果后边不带任何字符(直接换行),表示我们希望 C 语言将该行以及下一行看做是一个整体。
2. 定义符号常量(宏定义)
符号常量的定义格式是:
#define 标识符 常量
其中这个 #define 是一条预处理命令(预处理命令都以"#"开头),我们也称为宏定义命令。它的功能就是把程序中所有出现的标识符都替换为随后的常量。
演示案例:
#include <stdio.h>
#define URL "https://blog.csdn.net/studingbear"
#define NAME "Studyingbear"
#define BOSS "秃顶熊"
#define YEAR 2021
#define MONTH 9
#define DAY 23
int main()
{
printf("%s成立于%d年%d月%d日\n", NAME, YEAR, MONTH, DAY);
printf("%s是%s创立的……\n", NAME, BOSS);
printf("%s的域名是%s\n", NAME, URL);
return 0;
}
上边的大写字母 URL、NAME、BOSS、YEAR、MONTH、DAY 这些都是符号常量,正如大家看到的,为了将符号常量和普通的变量名区分开,我们习惯使用全部大写字母来命名符号常量,使用小写字母来命名变量。
3. 标识符
在 C 语言中,标识符指的就是一切的名字。比如刚刚的符号常量名是标识符,变量名也是一个标识符。以及我们即将学到的函数、数组、自定义类型这些的名字都称之为标识符。
4.数据类型
数据类型
在 C 语言里,所谓的数据类型就是坑的大小。我们说变量就是在内存里边挖一个坑,然后给这个坑命名。那么数据类型指的就是这个坑的尺寸。C 语言允许使用的类型如下:
short和long
我们可以为这些基本数据类型加上一些限定符,比如表示长度的 short 和 long。比如 int 经过限定符修饰之后,可以是 short int,long int,还可以是 long long int(这个是 C99 新增加的)。、
这里 C 语言并没有限制 int 的坑具体要挖多大,short int 或 long int 的坑又要挖多大。标准只是要求:short int <= int <= long int <= long long int。
sizeof运算符
sizeof 用于获得数据类型或表达式的长度,它有三种使用方式:
sizeof(type_name); //sizeof(类型);
sizeof(object); //sizeof(对象);
sizeof object; //sizeof 对象;
下面就来看看一些常见数据类型所占的坑的大小(单位是字节)
#include<stdio.h>
int main()
{
printf("int = %d\n",sizeof(int));
printf("short int = %d\n",sizeof(short));
printf("long int = %d\n",sizeof(long));
printf("long long int = %d\n",sizeof(long long));
printf("char = %d\n",sizeof(char));
printf("_Bool = %d\n",sizeof(_Bool));
printf("float = %d\n",sizeof(float));
printf("double = %d\n",sizeof(double));
printf("long double = %d\n",sizeof(long double));
return 0;
}
signed和unsigned
还有一对类型限定符是 signed 和 unsigned,它们用于限定 char 类型和任何整型变量的取值范围。
signed 表示该变量是带符号位的,而 unsigned 表示该变量是不带符号位的,用%u来输出。带符号位的变量可以表示负数,而不带符号位的变量只能表示正数,它的存储空间也就相应扩大一倍。默认所有的整型变量都是 signed 的,也就是带符号位的。
因此加上 signed 和 unsigned 限定符,四种整型就变成了八种:
- [signed] short [int]
- unsigned short [int]
- [signed] int
- unsigned int
- [signed] long [int]
- unsigned long [int]
- [signed] long long [int]
- unsigned long long [int]
如果给已申明的无符号的变量硬塞了一个带符号的数(如负数)进去,再用无符号的形式打印,就会出错,如下:
成功打印了一个-1,因为申明时默认i变量是有符号,而j的打印结果却是65535,这与unsigned short这种数据类型的取值范围(0~65535)有关。
switch语句和分支嵌套
…… // 其它语句
switch (表达式)
{
case 常量表达式 1: 语句或程序块;
case 常量表达式 2: 语句或程序块;
……
case 常量表达式 n:语句或程序块;
default: 语句或程序块;
}
…… // 其它语句
- 这里每个 case 后边的常量是匹配 switch 后面那个表达式的值
- case 后边必须跟一个常量值,而不能是一个范围
- 当 switch 跳到某个位置之后,就会一直往下执行,所以我们这里还需要配合一个 break 语句,让代码在适当的位置跳出 switch。
- default 是可选的,如果没有 default,并且所有的 case 均不匹配,那么 switch 语句不执行任何动作。
下面是一道曾经的oj题,涉及到Switch语句的几个要点
题目描述
企业发放的奖金根据利润提成,如下规则
利润≤10000元时,奖金可提10%;
10000<利润≤20000时,低于10000元的部分按10%提成,高于10000元的部分,可提成 7.5%;
20000<利润≤40000时,低于20000元部分仍按上述办法提成,(下同),高于20000元的部分按5%提成;
40000<利润≤60000元时,高于40000元的部分按3%提成;
60000<利润≤100000时,高于60000元的部分按1.5%提成;
利润>100000时,超过100000元的部分按1%提成
注意奖金是整数,无小数
要求:用switch实现,不可使用if else语句。
输入
第一行输入T表示有T个测试实例
第二行起,每行输入一个数据(正整数且小于10的10次方)表示利润,连续输入T行
输出
每行输出应得的奖金
#include<stdio.h>
int main()
{
int t,profit,i,reward;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d",&profit);
int m=profit/10000;
if(m<10){
switch(m){
case 0: reward = profit*0.1;break;
case 1: reward = 10000*0.1+(profit-10000)*0.075;break;
case 2:
case 3: reward = 10000*0.1+10000*0.075+(profit-20000)*0.05;break;
case 4:
case 5: reward = 10000*0.1+10000*0.075+20000*0.05+(profit-40000)*0.03;break;
case 6: case 7: case 8:
case 9: reward = 10000*0.1+10000*0.075+20000*0.05+20000*0.03+(profit-60000)*0.015;break;
}
}else{
reward = 10000*0.1+10000*0.075+20000*0.05+20000*0.03+40000*0.015+(profit-100000)*0.01;
}
printf("%d\n",reward);
}
return 0;
}
由于case后只能跟一个常量值,所以得想办法把题目中的范围改为适用于Switch语句的形式。
某种情况后没有语句或程序块的话,则顺位下移,执行下一种情况的语句。
为了不让switch一直往下执行,我在每种情况后配合一个 break 语句,让代码跳出 switch。
break与continue
执行break语句,可直接跳出循环
但对于嵌套循环来说,break语句只负责跳出所在的那一层循环,要跳出外层循环则需要再布置一个 break 语句才行。
continue语句
当满足某个条件的时候,跳过本轮循环的内容,直接开始下一轮循环。
当执行到 continue 语句的时候,循环体的剩余部分将被忽略,直接进入下一轮循环。
对于嵌套循环来说,continue 语句跟 break 语句是一样的:它们都只能作用于一层循环体。
正因为用continue时循环体的剩余部分将被忽略,所以for语句和while语句的执行过程因此不同
#include<stdio.h>
int main()
{
int i;
while(i<100)
{
if(i>2)
{
continue;
}
i++;
}
return 0;
}
如以上代码就是错误的,在while语句中,调整部分(如上的i++)是循环体的一部分,因此continue语句会把它也跳过,引起错误。而在for语句中,continue语句跳过循环的剩余部分,知道回到调整部分。
运算符
以下是一些我不太熟悉的运算符
C语言中有一个唯一的三目运算符,提供一种简写的方式来表示 if-else 语句。
语法:exp1?exp2:exp3;
exp1 是条件表达式,如果结果为真,返回 exp2,如果为假,返回 exp3。
if (a > b)
{
max = a;
}
else
{
max = b;
}
//可直接写成
max = a > b ? a : b;
查漏补缺中,本篇未完待续~
部分整理自鱼c论坛“带你学c带你飞”课程,部分文字及图片来自原课程
如有错误,欢迎纠正
如有侵权,请联系删除