C语言基础复习

 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带你飞”课程,部分文字及图片来自原课程

                                                                                                                          如有错误,欢迎纠正

                                                                                                                       如有侵权,请联系删除

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值