Fork me on GitHub

关于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()函数

posted @   硫酸钠  阅读(372)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示