C语言初阶------------中(适合于初学者)

目录

一、选择语句

二、循环语句

三、函数

四、数组

4.1数组的定义

4.2数组的下标

4.3数组的使用

五、操作符

算术操作符

移位操作符(移的是二进制位,之后会讲解)

位操作符(之后讲解)

赋值操作符

单目操作符

关系操作符

逻辑操作符(关注真假)

条件操作符(三目操作符)

逗号表达式(逗号隔开的一串表达式)

下标引用、函数调用和结构成员

六、常见关键字

static -----静态的

修饰局部变量

修饰全局变量

修饰函数

关键字typedef


一、选择语句

引言:C语言是结构化的程序设计语言 

顺序结构、选择结构、循环结构

选择语句可以使用  if  else

举例

#include <stdio.h>
int main()
{
  int a;
  if(a>0)
   printf("成功\n");
  else
    printf("失败\n");
  return 0;
}

二、循环语句

  • while语句
  • do.......while语句
  • for语句

此处先讲解while语句,其他在后续内容会讲解。

while()语句,当满足()内的条件时,程序继续while循环,不满足时退出循环。

举例

#include<stdio.h>
int main()
{
  printf("开始学习\n");
  int line = 0;
  while(line<=20000)
  {
      line++;
      printf("我要继续努力敲代码\n");
   }
  if(line>20000)             //循环可能会被其他因素打破
      printf("offer\n");
  return 0;
}

注意:当while循环后要执行的代码不只有一行时,需要使用{ }。

三、函数

在数学中的函数:f(x)=2*x;

在C语言中的函数与之也有相似之处,给出相应的操作数只能得出唯一的结果。

那么函数在c语言中有什么优势呢?接下来举例说明

#include<stdio.h>
int main()
{
  int num1=0;
  int num2=0;
  int sun=0;
  printf("输入两个操作数:>");
  scanf("%d %d",&num1,&num2);
  sum=num1+num2;
  printf("sum=%d\n",sum);
  return 0;
}

我们可以知道,如果上述只需要相加一次那么上面的代码显然很简单,但是如果要执行多次相加呢?由此我们可以引出函数的概念来,那么上面的代码就可以写成:

#include<stdio.h>
int Add(int x,int y)
{
  int z=x+y;
  return z;
 
}
int main()
{
  int num1;
  int num2;
  int sum;
  printf("输入两个操作数:>");
  scanf("%d %d",&num1,&num2);
  sum=Add(num1,num2);       //调用函数
  return 0;
}

那这样显然简单了,接下来我们来分析一下调用的这个函数吧!

bc2b070f44e84ab69515e1dc102b7383.jpeg

 int是返回类型,Add是函数名,int x,int y是形式参数,{ }内的是函数体。

四、数组

如果我们要存储1-10的数字,要怎么存储呢?

C语言中给出了数组的定义:一组相同类型元素的集合

4.1数组的定义

例如:

类型名+数组名+数组中元素个数
int arr[10] = {1,2,3,4,5,6,7,8,9,10};  //定义一个整型数组,最多放10个元素

char  ch[5] ={0};  //不完全初始化,第一个元素初始化为0,剩余的默认会初始化为0

有时候如果[ ]内没有填写数据元素的个数,C语言系统会自动补上

char ch[ ]={0};                  //数组中只有一个元素

char ch2[ ] = {'a','b','c'};    //3个元素

4.2数组的下标

C语言规定:数组的每个元素都有一个下标,下标是从0开始的。

数组可以通过下标来访问。

int arr[10] = {0};

//如果数组10个元素,下标的范围是0-9.

5cffc0d6382b4ed387b90a5ac8168e83.jpeg

注意:如果是下列情况

    printf("%d",arr[18]);  //此时arr中一个有10个元素,最后一个元素为arr[9],此时arr[18]越界访问了,错误。

4.3数组的使用

#include<stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };   //创建数组
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);    //访问数组元素
	}
	printf("\n");
	return 0;
}

五、操作符

算术操作符


+          -          *           /          %

/(除号)两端的操作数如果是整数,执行的是整数除法,至少有一个操作数是浮点数执行的才是浮点数的除法。

例:
ffecc5b7a3e040bfb9c5d3cf8e5fef1a.pngb847d972531f43c0a4e9ea1fdbb4cdd5.png

 %操作符  关注的是除法后的余数,操作符的两个操作符必须是整数。

移位操作符(移的是二进制位,之后会讲解)

>>         <<

位操作符(之后讲解)

&        |          ^

赋值操作符

=       +=      -=       *=        /=        &=        ^=       |=      >>=        <<=  

#include<stdio.h>
int main()
{
	int a = 0;  //创建变量,并初始化
	a = 20;  //赋值
	a += 5;  //等价于a=a+5

	a = a * 2;
	a *= 2;
	return 0;
}

单目操作符

此处简单介绍单目操作符与双目操作符的区别

例如:2                +         3

           左操作数               右操作数               有两个操作数就叫做双目操作符

                                                                      只有一个操作数叫做单目操作符

!                          逻辑反操作

-                              负值

+                             正值

&                            取地址

sizeof                     操作数的类型长度(以字节为单位)

~                            对一个数的二进制按位取反

--                            前置、后置--

++                          前置、后置++

*                             间接访问操作符(解引用操作符)

(类型)                   强制类型转换

!操作符

C语言中用0\1来表示真假,0表示假,非0表示真。

!操作符即逻辑反操作就是使真的变为假的,假的变为真的。

例如:若   a   为真,那么  !a   即为假。

aadda2ed4aef4d409145c89662b86c0b.png

 -、+

-即取操作数的负值

+操作数的值不变

f1ae8031abc84480aa67c3558651f952.png

&操作符之后详细讲解

sizeof操作符 

许多的初学者在学习C语言的时候都会有一个疑问那就是:sizeof到底是不是函数?
此处由我来为你们解答:sizeof不是函数,他是操作符。

在这里我将通过函数的特性来说明sizeof不是函数:
在使用sizeof来求操作数的类型长度时,sizeof(a)中的()可以省略,但是如果是函数的话函数名后面的括号是不可以省略的,因此sizeof不是一个函数。但是注意sizeof(int)如果()里面是类型名的话,是不可以省略的。

#include<stdio.h>
int main()
{
	int a = -1;
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof a);
	printf("%d\n", sizeof(int));
	return 0;
}

我们可以通过sizeof知道操作数的类型长度,具体如下

48c10cdddd954e30b5def1e422a64fda.png

 其次可以用来计算数组元素的个数:

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%d\n", sizeof (arr));  //40
	int sz = sizeof(arr) / sizeof(arr[0]);  //10
	printf("%d\n", sz);
	return 0;
}

插个小知识点:

  • strlen是库函数,只能针对字符串,求字符串的长度,计算的是字符串中\0之前的字符个数。
  • sizeof是操作符,是计算所占内存的大小。

--、++

  • 前置--:先--后使用
  • 后置--:先使用后--
  • 前置++:先++后使用
  • 后置++:先使用后++

1e9ad3d62052424cac2427f5dcb4096c.png

 (类型)操作符

强制类型转换例如int a=(int)3.14;

此时就把3.14(浮点型)转变为int(整型)。

关系操作符

>

>=

<

<=

!=                      用于测试“不相等”

==                     用于测试“相等”

此处我们着重讲解!=、==

!=、==

#include<stdio.h>
int main()
{
	int a = 3;
	int b = 3;
	if(a!=b)
		printf("hehe\n");
	else if (a == b)
	{
		printf("haha\n");
	}
	return 0;
}

但是两个字符串是不能使用==来判断相等的,使用strcmp(需要引头文件string.h)

#include<stdio.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcdef";
	if (strcmp(arr1, arr2) == 0)   //此时arr1与arr2相等
	{
		printf("==\n");
	}
	else
		printf("!=\n");
	return 0;
}

注意:==是相等,=是赋值。

逻辑操作符(关注真假)

&&             逻辑与--并且

||                逻辑或--或者

#include<stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	int c = a && b;
	printf("%d\n", c);
	return 0;
}

&& 如果a,b两个数中有一个数是假(0)那么a&&b为0

||如果a,b两个数中有一个数为真(1)那么a||b为1

条件操作符(三目操作符)

exp1?exp2:exp3;

此表达式的意思为:
如果exp1为真,表达式2(exp2)的结果为整个表达式的结果

如果exp1为假,表达式3(exp3)的结果为整个表达式的结果

#include<stdio.h>
int main()
{
	int a = 10;
	int b = 0;
	if (a > 5)
		b = 3;
	else
		b = -3;
	//可以等价为b=(a>5?3:-3);
	return 0;
}

逗号表达式(逗号隔开的一串表达式)

exp1,exp2,exp3.......expN

逗号表达式的特点:
从左到右依次计算,整个表达式的结果是最后一个表达式的结果

#include<stdio.h>
int main()
{
	int b = 5;
	int c = 0;
	int d(a += 2, b = b - c + a, c = a + b);
	     //a=5      b=10        c=15
	printf("%d\n", d);
	return 0;
}

下标引用、函数调用和结构成员

[ ]                ( )             .                ->

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };   //创建一个数组,下标是0-9
	arr[4] = 5;
	//下标引用操作符
    //arr 、 4是[]的两个操作数
	return 0;
}
#include<stdio.h>
int Add()
{
	return x + y;
}
int main()
{
	int c = Add(2, 3);   //()是函数调用操作符 操作数是Add,2,3
	printf("c=%d\n", c);
	return 0;
}

六、常见关键字

C语言提供了丰富的关键字,这些关键字都是语言本身预先设计好的,用户是不能自己创建关键字的。

auto   break   case   char    const    continue    default   do    double    else    enum    extern    float    for   goto    if     int     long    register    return     short     signed     sizeof    static    struct   switch     typedef    union    unsigned     void     volatile    while

auto ----- 创建自动变量的

局部变量都是自动创建自动销毁的,所有的局部变量都是auto修饰的,因为局部变量都有auto,所以auto自动省略了。

#include<stdio.h>
int main()
{
	auto int a = 10;
	return 0;
}

enum  (枚举类型关键字)

extern    是用来声明外部符号的

register -----寄存器变量

在计算机中数据可以存放在哪里呢?

1.内存                 2.硬盘                    3.高速缓存                         4.寄存器

d0d4c2c13ee6474a82ffe9348701ec27.png

因为寄存器中元素更加快速,所以我们就希望自己创建的变量放在寄存器中

#include<stdio.h>
int main()
{
	//建议把10放在寄存器中,最终是否放在寄存器中取决于编译器
	register int a = 10;
	//速度更快
	return 0;
}

但是现在的寄存器已经足够聪明,即使不写register,如果编译器认为有必要把他放在寄存器中,也会把他放在寄存器中。

static -----静态的

在C语言中:

static是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数
  • 修饰局部变量

b793609c0a6c407e94470794671a4442.png557b429371354b19bf7d5d221f03c7f5.png

 我们可以对比一下两个代码中第二个代码中局部变量前面加了static导致了最终的运行结果不同,那这是为什么呢?

首先我们要明白在内存中存储区域有栈区、堆区、静态区。

2bfb039bdbb6417fa446aa8e0e6bfd32.png在栈区上创建的变量都被称为临时变量,在静态区创建的变量进入范围内存在离开时也不销毁,直到整个结束,要注意在静态区存储的变量是可以改变的。

 那我们来解释一下上述代码吧!

在第一个代码中,局部变量int =3前面并没有加static,说明他是在栈区存储,在进入局部变量的作用域内时生命周期开始,出了作用域自动销毁。

而第二个代码中,加了static,那么这个变量将在静态区里面存储,此时他的生命周期就延长了直到整个程序完成。

那么我们来总结一下吧!
普通的局部变量是放在内存的栈区上的,进入局部范围,变量创建,除了局部范围,变量销毁。

当static修饰局部变量的时候,局部变量是在静态区开辟的,这时的局部变量出了作用域,变量不销毁,下次进去作用域,使用的是上一次遗留的数据。(改变了存储位置,由栈区变为静态区,使得变量的生命周期发生了变化)。

修饰全局变量

一个全局变量在其他的文件定义在本文件里面也可以使用。

7a825e1e628b4d2fa9ce4ac169784c32.jpeg

d6cf50faf5fe48efb72213362640811c.jpeg

对比以上两个代码,我们发现当全局变量前面加上static的时候,代码无法运行,那这又是为什么呢?
全局变量是有外部链接属性的,如果全局变量被static修饰,外部链接属性就变成了内部链接属性,本工程中其他的源文件无法再通过链接找到这个变量。static修饰的全局变量只能在自己所在的.c文件里面使用。 

修饰函数

static修饰函数时和修饰全局变量相似。

0efa1d09a51f4c0a88b651a9f9c76cef.jpeg

324ec31cffc945f69e8a6e6f2613dbbb.jpeg

函数是具有外部链接属性的,其它源文件想要使用函数,只需要正确的声明就可以了。

但是函数被static修饰就由外部链接属性变为了内部连接属性,这个时间函数只能在自己所在的.c文件内部使用,不能在外部使用。

外部链接属性--------------全局变量,函数

内部链接属性--------------static修饰的全局变量,函数

无链接属性   ---------------局部变量

关键字typedef

typedef顾名思义是类型定义,可以理解为类型重命名。

例如

#include<stdio.h>
typedef int ll;
ll main()
{
	ll i = 0;
	printf("%d\n",i);
	return 0;
}

  上述即为把int类型重命名为ll。

好了今天的内容先分享到这里,希望大家多多关注!

后续内容在本账号敬请期待!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值