从0基础入门C语言(二)

185 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

初识C语言(二)

本章目录

  • 什么是C语言
  • 第一个C语言程序
  • 数据类型
  • 变量、常量
  • 字符串+转义字符+注释
  • 选择语句
  • 循环语句
  • 函数
  • 数组
  • 操作符
  • 常见关键字
  • define 定义常量和宏
  • 指针
  • 结构体

五、字符串+转义符+注释

字符串

由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。

int main()
{
	"abcdef";
	"hello bit";
	""; // 空字符串
	return 0;
}

注:字符串的结束标志是一个\0的转义字符。在计算机字符串长度的时候\0是结束标志,不算作字符串内容。

// 字符串可以放在数组里面
int main()
{
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c'};
	printf("%s\n",arr1);
	printf("%s\n",arr2);
	return 0;
}

打印结果。。。。。在这里插入图片描述 解决办法 这个原因是因为C语言里面的字符串有一个结束的标识符 “\0”,然后arr1 这个字符串结尾是默认有的,然后arr2是没有的,在arr2 后面呢在添加一个0这个值就可以了, 因为0是 "\0"的值在这里插入图片描述 Fn + F10 或者直接 F10 进入调试,然后点击操作栏调试-->窗口-->监视,进来之后我们可以看到“\0”的值是 0 在这里插入图片描述在这里插入图片描述 数据在计算上存储的时候,存储的是二级制

转义字符

转义字符:转变原来的意思。 给大家举个例子:

int main()
{
	printf("abc");
	return 0;
}

这个main函数运行结果是: abc
那如果在加上\n之后呢?
int main()
{
	printf("abc\n");
	return 0;
}

这个main函数的运行结果:
abc

abc 换行,上面这个空白就是 \n换行的意思,在这里面要说的就是 n 加了 \ 之后,你给他转义的,从一个字符n变成了 \n 换行的意思。

C语言的转义字符 在这里插入图片描述 注意:

  1. 区分,斜杠:"/" 与 反斜杠:"" ,此处不可互换
  2. \xhh 十六进制转义不限制字符个数 '\x000000000000F' == '\xF'

注释

1.代码中不需要的代码可以直接删除,也可以注释掉 2.代码中有些代码比较难懂,可以加一下注释文字

注释有两种风格:

  • C语言风格的注释 /xxxxx/
    • 缺陷:不能嵌套注释
  • C++风格的注释 //xxxxxxx
    • 可以注释一行也可以注释多行

六、选择语句 ---if

// 分支语句

int main()
{
	int input = 0;
	printf("想要好好学习C吗?");
	printf("快来加入瑞哥的博客!<1/0>");
	scanf("%d", &input);
	if (input == 0)
		printf("回家种红薯~");
	else
		printf("拿到offer");

	return 0;

七、循环语句

有时候我们可能要多次执行同一块代码。一般情况下,语句是按照顺序执行的,函数中的第一个语句先执行,接着第二个语句,以此类推。

循环类型

循环类型描述
while 循环当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件
for 循环多次执行一个语句序列,简化管理循环变量的代码
do...while 循环除了它是在循环主体结尾测试条例外,其他与while循环语句类似
嵌套循环您可以在while、for或者do...while 循环内使用一个或多个循环
控制循环的语句
控制语句描述
break 语句终止循环或者 Switch 语句,程序流将继续执行紧接着循环或 Switch 的下一条语句
continue 语句告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代
goto 语句将控制转移到被标记的语句。但是不建议在程序中使用goto语句

while 循环

int main()
{
	int line = 0;
	printf("观看瑞哥的博客!");
	while (line < 20000)
	{
		printf("观看%d次\n", line);
		line++;
	}
	if (line >= 20000)
		printf("看完了!");
	return 0;
}

八、函数

函数是一段可以重复使用的代码,用来独立地完成某个功能,它可以接收用户传递的数据,也可以不接收。接收用户数据的函数在定义时要指明参数,不接收用户数据的不需要指明,根据这一点可以将函数分为有参函数和无参函数。

将代码段封装成函数的过程叫做函数定义

C语言无参函数的定义

如果函数不接收用户传递的数据,那么定义时可以不带参数。如下所示:

dataType  functionName(){
    //body
}
  • dataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int、float、char 等。
  • functionName 是函数名,它是标识符的一种,命名规则和标识符相同。函数名后面的括号( )不能少。
  • body 是函数体,它是函数需要执行的代码,是函数的主体部分。即使只有一个语句,函数体也要由{ }包围。
  • 如果有返回值,在函数体中使用 return 语句返回。return 出来的数据的类型要和 dataType 一样。

例如,定义一个函数,计算从 1 加到 100 的结果:

int sum(){
    int i, sum=0;
    for(i=1; i<=100; i++){
        sum+=i;
    }
    return sum;
}

累加结果保存在变量==sum==中,最后通过==return==语句返回。sum 是 int 型,返回值也是 int 类型,它们一一对应。 ==return==是C语言中的一个关键字,只能用在函数中,用来返回处理结果。

将上面的代码补充完整:

#include <stdio.h>
int sum(){
    int i, sum=0;
    for(i=1; i<=100; i++){
        sum+=i;
    }
    return sum;
}
int main(){
    int a = sum();
    printf("The sum is %d\n", a);
    return 0;
}

运行结果: The sum is 5050

函数不能嵌套定义,main 也是一个函数定义,所以要将 sum 放在 main 外面。函数必须先定义后使用,所以 sum 要放在 main 前面。

注意:main 是函数定义,不是函数调用。当可执行文件加载到内存后,系统从 main 函数开始执行,也就是说,系统会调用我们定义的 main 函数。

无返回值函数 有的函数不需要返回值,或者返回值类型不确定(很少见),那么可以用 void 表示,例如:

void hello(){
    printf ("Hello,world \n");
    //没有返回值就不需要 return 语句
}

==void==是C语言中的一个关键字,表示“空类型”或“无类型”,绝大部分情况下也就意味着没有 return 语句。

C语言有参函数的定义

如果函数需要接收用户传递的数据,那么定义时就要带上参数。如下所示:

dataType  functionName( dataType1 param1, dataType2 param2 ... ){
    //body
}

dataType1 param1, dataType2 param2...是参数列表。函数可以只有一个参数,也可以有多个,多个参数之间由,分隔。参数本质上也是变量,定义时要指明类型和名称。与无参函数的定义相比,有参函数的定义仅仅是多了一个参数列表。

数据通过参数传递到函数内部进行处理,处理完成以后再通过返回值告知函数外部。

更改上面的例子,计算从 m 加到 n 的结果:

int sum(int m, int n){
    int i, sum=0;
    for(i=m; i<=n; i++){
        sum+=i;
    }
    return sum;
}

参数列表中给出的参数可以在函数体中使用,使用方式和普通变量一样。 调用 sum() 函数时,需要给它传递两份数据,一份传递给 m,一份传递给 n。你可以直接传递整数,例如:

int result = sum(1, 100);  //1传递给m,100传递给n

也可以传递变量:

int begin = 4;
int end = 86;
int result = sum(begin, end);  //begin传递给m,end传递给n

也可以整数和变量一起传递:

int num = 33;
int result = sum(num, 80);  //num传递给m,80传递给n

函数定义时给出的参数称为==形式参数==,简称==形参==;函数调用时给出的参数(也就是传递的数据)称为==实际参数==,简称==实参==。函数调用时,将实参的值传递给形参,相当于一次赋值操作。

原则上讲,实参的类型和数目要与形参保持一致。如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型,例如将 int 类型的实参传递给 float 类型的形参就会发生自动类型转换。

将上面的代码补充完整:

#include <stdio.h>
int sum(int m, int n){
    int i, sum=0;
    for(i=m; i<=n; i++){
        sum+=i;
    }
    return sum;
}
int main(){
    int begin = 5, end = 86;
    int result = sum(begin, end);
    printf("The sum from %d to %d is %d\n", begin, end, result);
    return 0;
}

运行结果: The sum from 5 to 86 is 3731

定义 sum() 时,参数 m、n 的值都是未知的;调用 sum() 时,将 begin、end 的值分别传递给 m、n,这和给变量赋值的过程是一样的,它等价于:

m = begin;
n = end;

函数不能嵌套定义

强调一点,C语言不允许函数嵌套定义;也就是说,不能在一个函数中定义另外一个函数,必须在所有函数之外定义另外一个函数。main() 也是一个函数定义,也不能在 main() 函数内部定义新函数。

下面的例子是错误的:

#include <stdio.h>
void func1(){
    printf("http://c.biancheng.net");
    void func2(){
        printf("C语言小白变怪兽");
    }
}
int main(){
    func1();
    return 0;
}

有些初学者认为,在 func1() 内部定义 func2(),那么调用 func1() 时也就调用了 func2(),这是错误的。

正确的写法应该是这样的:

#include <stdio.h>
void func2(){
    printf("C语言小白变怪兽");
}
void func1(){
    printf("http://c.biancheng.net");
    func2();
}
int main(){
    func1();
    return 0;
}

func1()、func2()、main() 三个函数是平行的,谁也不能位于谁的内部,要想达到「调用 func1() 时也调用 func2()」的目的,必须将 func2() 定义在 func1() 外面,并在 func1() 内部调用 func2()。

有些编程语言是允许函数嵌套定义的,例如 ==JavaScript==,在 ==Java==Script 中经常会使用函数的嵌套定义。

Fighter_ma: 弱小和无知不是生存的障碍,傲慢才是~