C语言学习笔记📝*//未完成//*
C语言简介
C 语言最初是用于系统开发工作,特别是组成操作系统的程序。由于 C 语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样,所以采用
C 语言作为系统开发语言。下面列举几个使用 C 的实例:操作系统 语言编译器 汇编器 文本编辑器 打印机 网络驱动器 现代程序 数据库 语言解释器 实体工具
C语言特点:
- 易于学习。
- 结构化语言。
- 它产生高效率的程序。
- 它可以处理底层的活动。
- 它可以在多种计算机平台上编译。
第一个C语言程序
#include<stdio.h>
int main(){ //在双引号中间输入Hello World
printf("Hello World");
return 0;
}
C 程序主要包括以下部分:
预处理器指令
函数
变量
语句 & 表达式
注释
#include <stdio.h>
就是一条预处理命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作。
int main();
一个C程序有且只有一个主函数,即main函数。
C程序就是执行主函数里的代码,也可以说这个主函数就是C语言中的唯一入口。
而main前面的int就是主函数的类型。小括号里是函数的参数,大括号里面的是函数体,就是函数的功能。
return是函数的返回值,根据函数类型的不同,返回的值也是不同的。
printf()是格式输出函数,这里就记住它的功能就是在屏幕上输出指定的信息
\n是转义字符中的换行符。
C程序一定是从主函数开始执行的
注释—程序的解释说明
注释是写给程序员看的。
C语言的注释有两种方法
1、注释一行
//注释内容
2、注释多行
/*注释内容
注释内容
注释内容*/
良好的程序规范
- 一个说明或一个语句占一行,例如:包含头文件、一个可执行语句结束都需要换行。
- 函数体内的语句要有明显缩进,通常以按一下 Tab 键为一个缩进。(最好用TAB,不要按空格)
- 括号要成对写,如果需要删除的话也要成对删除。
- 当一句可执行语句结束的时候末尾需要有分号。
- 代码中所有符号均为英文半角符号。
(如:英文分号;与中文分号;)程序中输入中文符号会报错。
标识符
C语言中标识符是用来对变量名、函数名、标号及其它各种用户定义的对象命名的。
C语言规定,标识符可以是字母(A~Z,a~z)、数字(0~9)、下划线_组成的字符串,并且第一个字符必须是字母或下划线。在使用标识符时还有注意以下几点
**
- 识符是严格区分大小写的。例如Imooc和imooc 是两个不同的标识符。
- 标识符最好选择有意义的英文单词组成做到"见名知意",不能使用中文。
- 标识符不能是C语言的关键字。
**
练习:输出一个三角形
C语言数据类型
C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
序号 | 数据类型即描述 |
---|---|
1 | 基本类型:它们是算术类型,包括两种类型:整数类型和浮点类型。(整数就是如:1、2、3、4、5这种;浮点数就是小数分为单精度浮点数和双精度浮点数,如1.12、3.45) |
2 | 枚举类型:枚举类型是C语言中的一种特殊类型,枚举类型可以让我们的程序使用一些固定长度和固定数值的变量值范围。 |
3 | void 类型:类型说明符 void 表明没有可用的值。 |
4 | 派生类型:它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。 |
整数类型
浮点类型
void 类型
数据类型转换:
C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型;在 C 语言中也可以对数据类型进行强制转换;
自动转换规则:
- a)浮点数赋给整型,该浮点数小数被舍去;
- b)整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中;
强制类型转换形式: (类型说明符)(表达式)
实例程序:
#include<stdio.h>
int main()
{
float f,x=3.6,y=5.2;
int i=4,a,b;
a=x+y;
b=(int)(x+y);
f=10/i;
printf("a=%d,b=%d,f=%f,x=%f\n",a,b,f,x);
}
例中先计算 x+y 值为 8.8,然后赋值给 a,因为a为整型,所以自取整数部分8,a=8;
接下来 b 把 x+y 强制转换为整型;
最后 10/i 是两个整数相除,结果仍为整数 2,把 2 赋给浮点数 f;
x 为浮点型直接输出。
变量及赋值
变量就是可以变化的量,而每个变量都会有一个名字(标识符)。变量占据内存中一定的存储单元。使用变量之前必须先定义变量,要区分变量名和变量值是两个不同的概念。
变量其实只不过是程序可操作的存储区的名称。
C中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C 是大小写敏感的。
变量定义的一般形式为:数据类型 变量名;
int i;
char a;
float b;
double c;
多个类型相同的变量:数据类型 变量名, 变量名, 变量名…;
int i, j, k;
char d, ch;
float f, salary;
double d,g;
注意:在定义中不允许连续赋值,如int a=b=c=5;是不合法的。
变量的赋值分为两种方式:
1、先声明再赋值
int a;
a=1;
2、声明的同时赋值
int a=1;
实例
#include <stdio.h>
// 函数外定义变量 x 和 y
int x;
int y;
int addtwonum()
{
// 函数内声明变量 x 和 y 为外部变量
extern int x;
extern int y;
// 给外部变量(全局变量)x 和 y 赋值
x = 1;
y = 2;
return x+y;
}
int main()
{
int result;
// 调用函数 addtwonum
result = addtwonum();
printf("result 为: %d",result);
return 0;
}
C 中的左值(Lvalues)和右值(Rvalues)
C 中有两种类型的表达式:
左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。
int g = 20;//有效语句
10 = 20;//无效语句
练习:求两数之和
常量
未完成
运算符
未完成
判断
未完成
练习:搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
int searchInsert(int* nums, int numsSize, int target)
{
int left = 0;
int right = numsSize - 1; // 定义了target在左闭右闭的区间内,[left, right]
while (left <= right) { //当left == right时,区间[left, right]仍然有效
int middle = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出
if (nums[middle] > target) {
right = middle - 1; //target在左区间,所以[left, middle - 1]
} else if (nums[middle] < target) {
left = middle + 1; //target在右区间,所以[middle + 1, right]
} else { //既不在左边,也不在右边,那就是找到答案了
return middle;
}
}
//没有找到目标值
return left;
}
循环
未完成
练习:判断输入的数字是几位数
#include <stdio.h>
int main()
{
long long n;
int count = 0;
printf("输入一个整数: ");
scanf("%lld", &n);
while(n != 0)
{
// n = n/10
n /= 10;
++count;
}
printf("数字是 %d 位数。", count);
}
函数
未完成
数组
未完成
指针
未完成
字符串
未完成
练习:整数反转
int reverse(int x){
int rev = 0;
while (x != 0) {
if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {
return 0;
}
int digit = x % 10;
x /= 10;
rev = rev * 10 + digit;
}
return rev;
}
*记 rev 为翻转后的数字,为完成翻转,我们可以重复「弹出」xx 的末尾数字,将其「推入」rev 的末尾,直至 xx 为 00。
要在没有辅助栈或数组的帮助下「弹出」和「推入」数字,我们可以使用如下数学方法:
// 弹出 x 的末尾数字 digit
digit = x % 10
x /= 10
// 将数字 digit 推入 rev 末尾
rev = rev * 10 + digit
题目需要判断反转后的数字是否超过 3232 位有符号整数的范围 [-2{31},2{31}-1][−231,231−1]
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode-solution-bccn/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*
练习:判断回文数
#include <stdio.h>
int main()
{
long long n;
int count = 0;
printf("输入一个整数: ");
scanf("%lld", &n);
while(n != 0)
{
// n = n/10
n /= 10;
++count;
}
printf("数字是 %d 位数。", count);
}
枚举、结构体与共用体
未完成
typedef关键字与强制类型转换
未完成
内存管理
未完成
递归
未完成
排序
未完成
查找
未完成