初识C语言(三)

感兴趣的朋友们可以留个关注,我们共同交流,相互促进学习。


文章目录

前言

八、函数

九、数组

(1)数组的定义

(2)数组的下标和使用

十、操作符

(1)算数操作符

(2)移位操作符

(3)位操作符

(4)赋值操作符

(5)单目操作符

(6)关系操作符

(7)逻辑操作符

(8)条件操作符

(9)逗号表达式

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

十一、常见关键字

总结



前言

我们在上个文章学习了,常量变量的作用域,生命周期以及等等,我们了解了字符串,转义字符注释等相关了解,我们还了解了选择语句和循环语句中的while语句,剩下的for和do while 循环之后会进行详细分析。


八、函数

就像数学中的函数,y=f(x)

C语言中的函数也跟数学中的函数也差不多。

例如以下代码,一下代码是求两个和:

cpp 复制代码
#include <stdio.h>
int main( )
{
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    scanf("%d %d",&num1,&num2);//输入
    sum = num1+num2;//求和
    printg("%d\n",sum);
    return 0;
}

我们用函数来写求两个数的和:

cpp 复制代码
#include <stdio.h>
int main( )
{
    int num1 = 0;
    int num2 = 0;
    int sum = 0;
    scanf("%d %d",&num1,&num2);//输入
    sum =Add(num1,num2);//求和
    printg("%d\n",sum);
    return 0;
}

这里的Add就是一个函数,来进行相加,我们可以把它想象成为一个工厂,对输入的材料进行加工,最后产出产品。这里的Add要进行加法操作,所以传进来的要是两个数,加数和被加数,也就是num1和num2,之后返回一个结果;

cpp 复制代码
Add(int x,int y)
{
    int z = 0;
    z = x+y;
    return z;
}

我们来进行Add函数的实现,首先是Add函数的名字,函数里面要传入两个数,我们在这里认为传入的数是两个整数,所以定义这两个数分别是x和y,函数的外壳写好了,接下来该分析函数内部如何实现,要计算两个数相加,我们定义一个整形z来表示结果,z等于这两个数进行相加,最后返回z,因为z是整形,所以函数返回的类型是整形。这时这个函数就写好了,在main函数中调用和传入参数就可以了。这里num1和num2叫做传入参数。

函数比较方便,随时调用,避免了重复。

九、数组

(1)数组的定义

当我们存储1-10的数字,我们是否要定义十个变量来进行存储,那样就会很麻烦,也许会觉得也就写十行代码的事,但要是要存储100个数字呢,是否还是一句一句打出来,那样是真的很麻烦。所以才会出现数组这个概念。

数组中可以存放一组相同类型的元素,也就是一组相同类型元素的集合。

cpp 复制代码
int arr[10] = {1,2,3,4,5,6,7,8,9,10};

上列代码就是数组的创建和初始化,我们命名数组的名字为arr,想让它里面有十个元素,所以定义里面10,又想让它的元素都是整形,所以在前面定义Int,添加等号来写数组里面的十个数从1-10。这样就创建了一个包括10个整形元素的数组。

(2)数组的下标和使用

数组里的元素是放在内存里面的,数组里每个元素都有下标的,而下标是从0开始的,如下:

是可以通过下标的方法来找到数组中的元素的,如下,如果我们想要通过下标来找到数字7,那么就要访问下标为6的元素。

cpp 复制代码
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[6]);

如果我们想把所有元素打印出来,可以通过while和下标来打印出来,while使i从0循环到9,也就是arr元素的下标,也就打印出来了这十个数:

cpp 复制代码
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d\n",arr[6]);
int i = 0;
while(i<10)
{
    printf("%d",arr[i]);
}

十、操作符

C语言中提供了非常丰富的操作符,使得C语言非常的灵活,什么事都可以干。

(1)算数操作符

算数操作符

    • * / %

算数操作符就是加减乘除和取余(%),当我们用15除(/)上一个2的时候,结果就是7 ,除法默认是整形,取余(模)就是得到余数。

如果我们除法想要得到小数的时候,我们前面给这个变量定义成float浮点数类型,之后用%f来输出结果,也就是打印浮点数类型,如果你那么想,那就错了哈哈。

如果除号的两端都是整数,那么执行的是整数的除法,除号两边至少有一个是浮点数才能执行浮点数的除法。

但是当取模的时候,两边都是整数才行。

(2)移位操作符

移位操作符

>> <<

左移和右移,这些都跟二进制有关,后续会进行深入了解

(3)位操作符

位操作符

& ^ |

按位与 按位或 按位异或,也与二进制有关,到后面深入了解

(4)赋值操作符

赋值操作符

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

cpp 复制代码
int main( )
{
    int a = 0;//初始化
    a = 20;   //赋值
    a = a+5;  //a+=5;
    return 0;
} 

当我们初始化一个变量a,并且赋值给20,想要加5还赋给a,也可以写成a=a+5, 这与a=a+5一样,没有差别。其它的也都一样,进行操作后又赋值给自己。

(5)单目操作符

单目操作符

! 逻辑反操作

  • 负值
  • 正值

& 取地址

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

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

-- 前置,后置--

++ 前置,后置++

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

(类型) 强制类型转换

cpp 复制代码
//  !  的使用
int main( )
{
    int a =5;
    if(a)
    {
        printf("OK\n");
    }
    if(!a)
    {
        printf("NO\n");
    }
    return 0;
}

在C语言中,非零为真,0为假,所以在这里,a不为假,在这里会进行下一步操作,也就是打印OK,如果我们想要进行打印NO,那么就要a为假,这里就用到了!,表示相反的逻辑,如果这时候a为0,所以这时候就打印NO。

cpp 复制代码
//  -
int a = 10;
int b = -a; 

这里b的数就是-10,这就是负号的使用,而当用到正号的时候。

cpp 复制代码
// +
int a = -10;
int b = +a;

当时我也以为b是10,但是结果出来后确是-10,没有发生变化,所以正号也可以省略不用写。

&后续会进行分析。

重点:sizeof是操作符

cpp 复制代码
int a =10;
float f =5.5f;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(f));

sizeof 是操作符 ,是计算变量所占内存空间的大小,单位是字节,这里a和f的字节数都是4,我们也可以将a和f换成int和float,所以里面放变量名也好,或者是变量的类型来说,结果都是一样的,两种写法都可以。

而我们之前提到的strlen是库函数,是计算字符串长度的,统计的是字符串\0之前出现的个数。而sizeof不管里面是什么,它只统计占用的字节内存是多少。

cpp 复制代码
// ++
int a =100;
int b = a++;

当++在后面的时候,这是后置++,先使用,后++,也就是先使用100,之后在自增1,变成了101。

当++在前面的时候,就是前置++,与之前的相反,也就是先加1,再使用,这时候a和b都是101。

--操作符也是这个原理,相同的逻辑但是不同的运算。

cpp 复制代码
//(类型)强制类型转换
int main( )
{
    int a =(int)3.14;
    printf("%d\n",a);
    return 0;
}

当我们写一个整形变量a的时候 ,想把3.14赋值给a,如果不加(Int),编辑器就会报错,说你可能会丢失数据,当加上(int)的时候,就将3.14强制类型转换,转换为整形,只保留正数部分。

(6)关系操作符

>

>=

<

<=

!= 用于测试"不相等"

== 用于测试"相等"

关系操作符就这么几个,用来表示关系,判断大小关系,其中==是判断相等的,而一个等号=就是赋值,当写选择语句的时候,要考虑清楚,两个等号是用来判断,一个是用来赋值。

(7)逻辑操作符

&& 逻辑与

|| 逻辑或

逻辑与的意思就是并且,两个都需要,而逻辑或是或者的意思,来一个就行或者两个都来,

cpp 复制代码
int a =3;
int b =5;
if(a && b)
{
    printf("OK\n");
}

一般是用来判断真假,也可以用来选择范围,这里a为3,b为5,两个同时是真,所以会打印OK,如果有一个是0,则不会打印,因为非0为真。

&&两边同时为真才为真,有一个为假了就为假。

|| 两边同时为假才为假,有一个为真就为真。

(8)条件操作符

exp1 ? exp2 : exp3

cpp 复制代码
int a = 0;
int b = 0;
int m = 0;
scanf("%d %d", &a,&b);
if(a>b)
    m=a;
else
    m=b;
printf("%d\n",m);

这是一个比较两个数输出较大值的一个简单写法,如果觉得这样写繁琐,就可以用条件逻辑符来进行写:

cpp 复制代码
m=(a > b ? a : b);

如果表达式1里面的a>b这个条件为真,表达式2就执行,也就是返回a的值,如果表达式为假,就返回b的值,这个只能用于简单的语句。

(9)逗号表达式

exp1 , exp2 , exp3 , ...expN

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

\] ( ) . -\>

\]下标引用操作符 下标引用,就是刚才用数组通过下标来访问元素的符号。 ()函数调用操作符 上文中写了一个两个数相加的函数,Add来调用的时候,后面的()就是函数调用操作符。 . 和 -\>是结构成员访问操作符 操作符非常的丰富 ,后续都进行深入了解。这里先简单的了解一下,不同场景用不同操作符。 ## 十一、常见关键字 关键字必须要知道有什么,因为当我们在定义变量的时候,如果不知道关键字,就有可能会用关键字名字来命名变量名字,这些关键字是C语言事先预定好的,变量的命名之前说事不能有关键字的。 > auto break case const continue default do else enum > > extern for goto if register return sizeof static struct > > switch typedef union volatile while char double float int > > long short signed unsigned void **auto**关键字一般被省略了,因为局部变量一般都是在作用域里面自动创建自动销毁的,所以它其实前面有一个auto ,由于所有局部变量前面都有auto,所以就省略掉了。 **break**可以打破循环,在循环中可以使用。 **case**是在分支语句switch中使用。 **类型**有关:auto cha r int short long float double signed(有符号的) unsigned(无符号) static void enum const union typedef **循环**有关:break continue do while **分支**有关:if else switch case break default goto **声明外部符号**:extern **寄存器**:reister **函数**:return **计算所占内存大小**:sizeof 先进行了解,用多了就记住了。 *** ** * ** *** ## 总结 码要用手敲才会熟练 先了解,后续会一个个进行详解,对于我来说也是受益匪浅。

相关推荐
东方佑13 分钟前
深度解析Python-PPTX库:逐层解析PPT内容与实战技巧
开发语言·python·powerpoint
水w24 分钟前
【Android Studio】如何卸载干净(详细步骤)
android·开发语言·android studio·activity
weixin_3077791324 分钟前
判断HiveQL语句为建表语句的识别函数
开发语言·数据仓库·hive·c#
一顿操作猛如虎,啥也不是!29 分钟前
JAVA-Spring Boot多线程
开发语言·python
v维焓38 分钟前
C++(思维导图更新)
开发语言·c++·算法
jiet_h39 分钟前
深入解析KSP(Kotlin Symbol Processing):现代Android开发的新利器
android·开发语言·kotlin
_未知_开摆41 分钟前
uniapp APP端在线升级(简版)
开发语言·前端·javascript·vue.js·uni-app
花月C1 小时前
Spring IOC:容器管理与依赖注入秘籍
java·开发语言·rpc
ylfhpy1 小时前
Java面试黄金宝典22
java·开发语言·算法·面试·职场和发展
..过云雨1 小时前
11. 【C++】模板进阶(函数模板特化、类模板全特化和偏特化、模板的分离编译)
开发语言·c++