关于C语言的一些基础知识
C语言
神马是语言:C语言是一种高级计算机语言
神马是计算机语言:人与计算机交流的语言
国际标准:1989年美国推出ANSI C标准(如C89、C90、C99、C11等,由于C99与C11并不流行所以不少编译器不支持)
变量与常量
变量
和数学方程中的变量与常量类似,而C语言中变量可分为全局变量与局部变量
全局变量:在代码块以外的变量(简单地说就是在{}外的)
局部变量:在代码块以内的变量(简单地说就是在{}内的)
#include<stdio.h>
int main(void)
int a=100;
{
int a=10;
printf("%d\n", a)
return 0;
}
//当局部变量与全局变量有相同名字时,局部变量优先,所以尽量不要以相同名字
C语言语法规定,变量要定义在当前代码块的前面
常量
C语言中的常量和变量的定义形式有所差异
常量可以分类为以下几种:
1.字面常量
2.const修饰的常变量
3.#define定义的标识符常量
4.枚举常量
字面量是最常见也是最简单的常量,就是一个被定义的常量。如:
#include<stdio.h>
#define MAX 81/*MAX就是被#define定义的标识符常量*/
int main(void)
{
int num=4;
const int n=3;/*由于有const定义,所以a不能改变,n成了一个具有常属性的变量*/
enum SEX//一一列举出来的三个常量
{
MALE,
FEMALE,
SECRET
}
return 0;
}
作用域
变量的作用域:这是一种程序设计概念,通常来说,一段程序代码中所用到的名字并不是总有效的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
1.局部变量的作用域是变量所在的局部范围
2.全局变量的作用域是整个工程(包括函数)
说人话就是,你写的代码哪里可以用哪里就是它的作用域。上代码:
/*错误代码*/
#include<stdio.h>
int main(void)
{
int num = 0;//num的作用域就是该大括号
}
printf("num = %d\n", num")//num的作用域不在该代码块
return 0;
}
代码原型就是:
#include<stdio.h>
int main(void)
int num = 0;
printf("num = %d\n", num")
return 0;
}
声明标识符
在程序中使用标识符时要提前声明
#include
intmain(void)
{
extern int g_val;//声明外部标识符的extern外部符号
printf("g_val = %d\n", g_val);
return 0;
}
上述代码中说的的外部标识符指其他源文件的标识符
有没有发现不同之处?不同的地方就是num所在的代码块不同,而如果要打印出num的话,必须要在num所在作用域使用才可以
生命周期
1.局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
2.全局变量的生命周期是:整个程序的生命周期
一个小插曲
在第一次使用VS2019时会出现一个普遍的问题,即无法正常使用scanf()
这是因为VS2019的编译器无法识别scanf()导致,而VS的编译器会提供一个选择,就是使用scanf_s()来替换原来的scanf()
两者的区别:
scanf()是标准C语言提供的
scanf_s()是VS的编译器提供的
使用scanf_s()的代码没有跨平台性(也叫可移植性)
咋办呢?
可以在源文件第一行加一行代码解决:
#define _CRT_SECURE_NO_WARNINGS 1
也可以直接更改VS的编译库(只要你足够厉害)
数据类型
上代码:
#include<stdio.h>//包含一个叫stdio.h的文件
int main(void)//main()只能有一个;main()前的int表示main函数调用返回一个整型值
{
printf("嗨!靓仔!\n");
return 0;
}
std-是指标准(standard);i和o是指input与output
int//整型
unsigned int//无符号整型
long//长整型
long long//更长的整型(C99标准)
long int//长整型
unsigned long int//无符号长整型
short//短整型
unsigned short//无符号短整型
char//字符数据类型
unsigned char//字符
float//单精度浮点数
double//双精度浮点类型
上代码:
#include<stdio.h>
int main(void)
{
double d = 3.14;
printf("圆周率约为%lf\n", d);
return 0;
}
/*计算各类型字符的大小*/
#include<stdio.h>
int main(void)
{
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long double));
return 0;
}
计算机中的单位:
bit(比特位)
byte(字节)
kb
mb
gb
tb
pb
……
一个字节等于八个比特位,而其余的都是以2的10次方为进率
计算机中常见的进制:二进制、八进制、十进制、十六进制等
不同类型字符占内存大小不同,使用合适的字符可以节省空间,例如:
int age=20;//int大小为4字节,范围是0~(2^32)-1,用于表示年龄绰绰有余
short int age=20;//short int大小为2字节,范围是0~(2^16)-1,空间的浪费更小
转换说明及输出
%e或%E(浮点数,e计数法)
%f(浮点数,十进制计数法)
%a或%A(浮点数、十六进制数和p计数法(C99/C11))
%o(无符号八进制整数)
%d(有符号十进制数整数)
%i(有符号十进制数整数(与%d一样))
%u(无符号十进制整数)
%x或%X(无符号十六进制整数,使用十六进制数0f(0F))
%g或%G(根据值得不同,自动选择%f或%e。%e格式用于指数小于-4或者大于等于精度时
%p(指针)
%s(字符串)
%c(单个字符)
%%(打印一个百分号)
一些基础知识
关键字不可以自己创建,例如:typedef、continue、break、default、if
define是预处理指令
sizeof(char)大小可以是4个字节,也可以是8个字节
指针是变量,用于存放地址
static:可以修饰局部变量;可以修饰全部变量;修饰的变量可以改变;可以修饰函数
C语言的五大类型:基本数据类型、构造类型、指针类型、空类型、自定义类型
strien是求字符串长度的,只针对字符串长度,是一种库函数,使用时必须引用头文件
sizeof计算变量、数组类型的,大小单位是字节,是一种操作符
浮点类型能表示包括小数在内更大范围的数
转换说明及输出
%e或%E(浮点数,e计数法)
%f(浮点数,十进制计数法)
%a或%A(浮点数、十六进制数和p计数法(C99/C11))
%o(无符号八进制整数)
%d(有符号十进制数整数)
%i(有符号十进制数整数(与%d一样))
%u(无符号十进制整数)
%x或%X(无符号十六进制整数,使用十六进制数0f(0F))
%g或%G(根据值得不同,自动选择%f或%e。%e格式用于指数小于-4或者大于等于精度时
%p(指针)
%s(字符串)
%c(单个字符)
%%(打印一个百分号)
float、double和long double
函数返回类型
void//无返回值
int//整型
unsigned int//无符号整型
long int//长整型
unsigned long int//无符号长整型
short//短整型
unsigned short//无符号短整型
char//字符数据类型
unsigned char//字符
float//浮点数
double//双精度浮点类型
struct type//
void *//
int */unsigned int*//
short */unsigned short*//
char */unsigned char*//
float *//
double *//
struct type *//
c99定义了bool型,即返回TRUE(true)/FALSE(false)
另外可以typedef任意一种类型。也就是说,你自己可以进行类型定义,可以返回任意的类型及其指针类型
puts函数,C语言puts函数用法详解
前面在输出字符串时都使用printf,通过“%s”输出字符串。其实还有更简单的方法,就是使用 puts() 函数。该函数的原型为:
# include <stdio.h>
int puts(const char *s);
这个函数也很简单,只有一个参数。s可以是字符指针变量名、字符数组名,或者直接是一个字符串常量。功能是将字符串输出到屏幕。输出时只有遇到 '\0' 也就是字符串结束标志符才会停止。
下面写一个程序:
# include <stdio.h>
int main(void)
{
char name[] = "祖国!";
printf("%s\n", name); //用printf输出
puts(name); //用puts()输出
puts("我爱你!"); //直接输出字符串
return 0;
}
输出结果是:祖国!祖国!我爱你!
可见使用 puts() 输出更简洁、更方便。
而且使用 puts() 函数连换行符 '\n' 都省了,使用 puts() 显示字符串时,系统会自动在其后添加一个换行符,也就是说:
printf("%s\n", name);
和:
puts(name);
是等价的。
所以前面字符指针变量中:
printf("%s\n", string);
也可以直接写成:
puts(string);
我们写一个程序来验证一下:
# include <stdio.h>
int main(void)
{
char *string = "I Love You China!";
puts(string);
return 0;
}
输出结果是:I Love You China!
但是 puts() 和 printf() 相比也有一个小小的缺陷,就是如果 puts() 后面的参数是字符指针变量或字符数组,那么括号中除了字符指针变量名或字符数组名之外什么都不能写。
比如 printf() 可以这样写:printf("输出结果是:%s\n", str);
而 puts() 就不能使用如下写法:
puts(输出结果是:str);
因此,puts() 虽然简单、方便,但也仅限于输出字符串,功能还是没有 printf() 强大。
gets函数
在读取字符串时,scanf()和转换说明%s只能读取一个单词,对字符串长度十分限制。gets()函数可用于解决此问题,gets()函数读取整行输入,直至遇到换行符,然后丢弃换行符,存储其余字符,并在这些字符的末尾添加一个空字符使其成为一个C字符串,它经常和puts()函数配对使用
/* getsputs.c -- 使用 gets() 和 puts() */
#include <stdio.h>
#define STLEN 81
int main(void)
{
char words[STLEN]="I want to learn about string theory !";
puts("Enter a string, please.");
gets(words);// 典型用法
printf("Your string twice:\n");
printf("%s\n", words);
puts(words);
puts("Done.");
return 0;
}
显然,运行时遇到了问题。因为该函数的不安全行为导致了安全隐患,再过去有人通过系统编程,利用gets()插入和运行一些破坏系统安全的代码。所以C11标准委员会直接废除了gets()函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了