C语言入门初识(中)

C语言入门初识(中)

  • 常量
    • 常量的分类
      • 1.字面常量
      • 2.const修饰的常变量
      • 3.define 定义的标识符常量
      • 4.枚举常量
  • 字符串+转义字符+注释
    • 字符串
      • C常用格式转换说明符
    • 转义字符
    • 注释
  • 选择语句与循环语句
    • 选择语句
    • 循环语句
  • 函数
  • 数组
    • 数组的定义
    • 数组的下标
    • 数组的使用
    • 变长数组

常量

所为常量就是不能够被改变的量

常量的分类

1.字面常量

所谓字面,就是在程序中直接以值的形式来进行操作表现的。
例如:30,3.14159,‘W’,“abcd”。

2.const修饰的常变量

常变量其实本质上是变量,但是它是一个不能改变的变量。那它是变量不能变有什么用呢?这个问题我在指针章节再来解释
接下来我就来说明一下它为什么是不能够改变的变量

#include
int main()
{
const int a = 10;
a = 20;
return 0;
}

在上面的代码中编译器会报错,这是因为它是一个不能够改变的量。

#include
int main()
{
const int a = 10;
int arr[a] = {0,1,2,3,4,5,6,7,8,9};
return 0;
}

在上述代码中还是会报错的因为数组[ ]中必须为常量而它为变量。
这就是为什么const是不能变的变量了。

3.define 定义的标识符常量

在一个程序中经常会用到很多相同的常量,大多都用字面常量来表示。但是改变的时候就要一一改变这样会很麻烦,所以定义了一个标识符常量,需求改变的时候就改变标识符常量所代表的值。但是要注意的是不能在程序内该,我所说的改变是改变定义时候的标识符常量的值。
下面来用代码一一解释说明

#define MAX 10
#include
int main()
{
int a = MAX;
int arr1[MAX] = {0,1,2,3,4,5,6,7,8,9};
int arr2[MAX] = {11,12,13,14,15,16,17,18,19,20};
return 0;
}

上述代码说明了标识符常量就是一个地地道道的常量。但是数组的最大值改变了,我们来看下面两段代码

#define MAX 10
#include
int main()
{
MAX = 15
int arr1[MAX] = {0,1,2,3,4,5,6,7,8,9};
int arr2[MAX] = {11,12,13,14,15,16,17,18,19,20};
return 0;
}
#define MAX 15
#include
int main()
{
int arr1[MAX] = {0,1,2,3,4,5,6,7,8,910};
int arr2[MAX] = {11,12,13,14,15,16,17,18,19,2021};
return 0;
}

第一个代码是错误的因为标识符常量是常量不能够改变,要想该变的话,必须是第二种改变定义时标识符常量的值。

4.枚举常量

在生活中我们常用一些常量是有尽的比如性别分为:男性,女性。三原色分为:黄,绿,蓝。
我们拿三原色:Red Green Blue举个枚举类型的例子

//枚举常量
enum Color
{
	RED,
	GREEN,
	BLUE
};
int main()
{
	enum Color c = RED;
	return 0;
}

上面就是枚举常量的使用,定义了一个枚举类型变量c赋值一个常量RED,就类似于 int num = 10;但是不能够赋值给除了定义的枚举常量外的常量了。

//枚举常量
enum Color
{
	RED,
	GREEN,
	BLUE
};
int main()
{
	RED = 20;//err
	MALE = 10;//err
	return 0;
}

上面编译器会报错,就是因为它是一个常量不能够被赋值。

字符串+转义字符+注释

字符串

"hello world"这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
顾名思义他是字面常量,字符串存储在字符数组中,格式为char arr[],
字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。

观察下面代码,打印结果是什么?为什么?

#include
int main()
{
char arr1[]={"abcdef"};
char arr2[]={'a','b','c','d','e','f'};
printf("%s",arr1);
printf("%s",arr2);
return 0;
}

上述代码中arr1存储的是一个字符串,以’\0’为结束标志,而arr2是存放的是6个字符,没有‘\0‘这个结束标志。在输出arr1内容时会输出该有的内容,但arr2的话内部不存在’\0‘只能在字符串后面的空间内找到’\0’才停止。

C语言入门初识(中)_第1张图片

那么字符串它的输出解决了,那么长度问题呢?
介绍一个函数strlen();该函数是测量字符串大小的,返回值为int,头文件为#include

#include
#include
int main()
{
	char arr1[] = { "abcdef" };
	char arr2[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	return 0;
}

C语言入门初识(中)_第2张图片

arr1数组中有’‘\0‘,该打小就是字符数组中’\0‘之前字符个数。但是arr2中没有’\0‘,当数组外空间有’\0‘时就会计算’\0‘之前字符的个数,由于’\0‘出现的位置是不确定的,所以arr2字符串的大小也是随机值。

%s为转换说明,对应字符串,下面介绍一下C语言常用的几个转换说明

C常用格式转换说明符

转换说明符 对应数据类型
%d 十进制整数
%c 字符
%s 字符串
%f 单精度浮点型
%lf 双精度浮点型
%zu 由sizeof()返回值的大小
%o 八进制整数
%x 十六进制整数

转义字符

假如我们要在屏幕上打印一个目录: c:\code\test.c

#include
int main()
{
	printf("c:\code\test.c");
	return 0;
}

C语言入门初识(中)_第3张图片

这为什么和想象中的不一样呢???
接下来为你一一解答

当想要实现换行操作时‘\n’来进行换行
当进行回车操作时’\r’来进行回车
换行和回车现在大部分电脑中都没有差距,都是换到下一行开头位置。
上面提到的‘\t’就是水平制表符‘\t’相当于电脑上tab键。

\ddd \xdd分别代表一到三个八进制数或两个十六进制数所代表的ASCII值对应的符号
那么什么是ASCII值呢?计算机是二进制存储数据没有办法进行直接存储字符,所以用一串二进制来代替该字符,ASCII值就是和字符一一对应的。
需要记忆的ASCII值也就‘A’–65, ‘a’–97, ‘0’–48.

#include
int main()
{
	printf("%c\n", '\107');
	printf("%c\n", '\x47');
	return 0;
}

C语言入门初识(中)_第4张图片

如上图这代码和输出结果分别代表8进制和16进制ASCII值对应的符号

那么问题来了, c:\code\test.c具体应该怎么输出呢?
C语言语法中\ ’ “这三种可以表示,'和”,在printf("%c",’’’);系统会默认前两个‘’配对第三个‘落单,最后系统会报错。

输出代码

#include
int main()
{
	printf("c:\\code\\test.c");
	return 0;
}

扩展题printf("%d\n", strlen(“c:\test\628\test.c”));输出结果是多少?1

转义字符 释义
\n 换行
\r 回车
\t 水平制表符
\ddd ddd表示1~3个八进制的数字。
\xdd dd表示2个十六进制数字。
\\ 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\’ 用于表示字符常量’
" 用于表示一个字符串内部的双引号

注释

注释有两种风格:

  • C语言风格的注释 /xxxxxx/

    • 缺陷:不能嵌套注释
  • C++风格的注释 //xxxxxxxx

    • 可以注释一行也可以注释多行

    vs2019快捷键ctrl+k+c–>注释,ctrl+k+u–>取消注释
    c++注释风格要比C注释风格好用一次些,嵌套注释时c注释就不行了

写注释的好处

    1. 注释可以梳理梳理
    1. 对复杂的代码进行解释
    1. 写代码的时候写注释,是帮助自己,帮助别人的

选择语句与循环语句

在生活中人们面临的事情要么是顺序做事,要么面临选择,要么日复一日循环做事,C语言中也有顺序结构,选择结构,循环结构来完成C程序

选择语句

选择语句有if else语句,有switch语句,再这先介绍if else语句
if(x)else,如果X为真进入if,为假进入else
模拟一个选择过程:

#include
int main()
{
printf("在人生过程中你想要继续努力嘛?\n");
printf("1:坚持 2:放弃\n");
int input = 0;
scanf("%d",&input);
if(input==1)
{
printf("发现你人生的命数\n");
}
else
{
printf("颓废过完一生\n");
}
return 0;
}

== 符号是判断两值是否相等,相等为真进入语句,不等为假不进入语句

循环语句

C语言常用的循环有三种while();for;do while();
我们接下来介绍while循环:
while(x),x为真进入循环,为假出循环

#include
int main()
{
	int line = 0;
	while (line <= 30000)
	{
		printf("写代码:%d\n",line);
		line+=1;
	}
	if (line >= 30000)
	{
		printf("代码能力显著提高");
	}
	return 0;
}

最终结果展示了写了30000行有效代码最终代码能力有效提高;

函数

int Add(int x,int y); 是一个函数的声明,int 代表函数返回类型,Add代表函数名,x y 代表函数实参。
函数相当于是一个工厂,传进去的参数相当于是原料,函数内部相当于工厂加工过程,返回值相当于产品。
用函数求2个任意整数和:

#include
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int sum = Add(a, b);
	printf("sum = %d\n", sum);
	return 0;
}

那么定义这个函数的意义在哪呢?直接写int sum = a+b;不是更方便吗?
在以后的编程中会遇到代码行数很多而又复杂并且多次使用的代码过程,用函数把这段代码封装起来,就会更加方便不会重复书写大量代码同时也会使主函数更简洁。

数组

数组的定义

我们定义一个数用 int a; 定义两个数再定义个int b;如果定义10个20个呢?这样会不会显得非常麻烦。C语言就用了数组的概念来定义一组数字。
int a[10] = {1,2,3,4,5,6,7,8,9,10};这样一下定义了10个元素。
还可以定义char a[10];double a[10]……

数组的下标

把数据元素存储在数组中由下标来进行访问,数组的下标是从0开始的。
第九个元素下标也就是8;数组有十个元素,下标范围是0~9

数组的使用

我们来用循环语句遍历输出数组元素

#include
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	while (i < 10)
	{
		printf("%d ", arr[i]);
		i++;
	}
	return 0;
}

变长数组

变长数组:C语言术语,也简称VLA。是指用整型变量或表达式声明或定义的数组,而不是说数组的长度会随时变化,变长数组在其生存期内的长度同样是固定的。百度百科

int main()
{
int n = 10;
int arr[n];
return 0;
}

此种语法格式是在C99标准出现的,但是有的编译器不支持C99,例如vs系列编译器用变长数组则不会通过。

在这串代码中数组可以定义但不可以初始话例如int arr[n]={1,2,3,4,5};这种在C99标准中也是错误的


  1. 14(注意八进制数不能有8) ↩︎

你可能感兴趣的:(c语言)