title: c语言
tags: c语言
categories: 编程学习
abbrlink: 52814
date: 2021-10-22 19:49:41
一、C语言程序基本结构
以 # 开头的语句称为预处理指令
#include <stdio.h>
//standared 标准 input output 输入/输出
//header 头文件 .h include包含
void main(){
printf("HelloWorld!\n")
system("pause"); //暂停函数,请按任意键继续...
return 0;
}
.h为后缀的文件称为头文件。可以是C标准库的头文件,也可以是自定义的库文件。
stdio.h文件中包含了有关输入输出语句的函数。
main()函数是c程序执行的入口
printf()的作用是打印一行文字
return 0; 终止 main() 函数,并返回值 0
小结
- 因编译器的原因,生成的 .exe 文件打开时会一闪而过,从而观察不到其运行的结果,这是因为 main() 函数结束时,DOS 窗口会自动关闭。为了避免这个问题可在 return 0; 前加入 system(“pause”); 语句。
二、编译和执行过程
- 打开一个文本编辑器,添加上述代码。
- 保存文件为 hello.c。
- 打开命令提示符,进入到保存文件所在的目录。
- 键入 gcc hello.c,输入回车,编译代码。
- 如果代码中没有错误,命令提示符会跳到下一行,并生成 a.out 可执行文件。
- 现在,键入 a.out 来执行程序。
- 您可以看到屏幕上显示 “Hello World”。
$ gcc hello.c
$ ./a.out
Hello, World!
请确保您的路径中已包含 gcc 编译器,并确保在包含源文件 hello.c 的目录中运行它。
如果是多个 c 代码的源码文件,编译方法如下:
$ gcc test1.c test2.c -o main.out
$ ./main.out
test1.c 与 test2.c 是两个源代码文件。
三、数据类型
数据类型分为:基本类型;枚举类型;void类型;派生类型
基本数据类型
数值类型:int、short、long、float、double
非数值类型:char
数据类型 | 类型说明符 | 位数 | 取值范围 |
---|---|---|---|
整型 | int | 32位 | -2147483648~+2147483647 |
短整型 | short int | 16位 | -32767~+32768 |
长整型 | long int | 32位 | -2147483648~+2147483647 |
单精度浮点型 | float | 32位 | -3.4E-38~+3.4E+38 |
双精度浮点型 | double | 64位 | 1.7E-308~1.7E+308 |
字符型 | char | 8位 | -128~+127 |
void类型
-
函数返回为空
C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status);
-
函数参数为空
C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如int rand(void);
-
指针指向void
类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 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);
}
四、变量
变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
变量声明:用于向程序表明变量的类型和名字。
定义也是声明,extern 声明不是定义。
定义也是声明:当定义变量时我们声明了它的类型和名字。
extern 声明不是定义:通过使用 extern 关键字声明变量名而不定义它。
[注意]
变量在使用前就要被定义或者声明。
在一个程序中,变量只能定义一次,却可以声明多次。
定义分配存储空间,而声明不会。
extern int a;//声明一个全局变量a
int a;//定义一个全局变量a
extern int a = 0;//定义一个全局变量a并给初值。一旦给予赋值,一定是定义,定义才能分配空间。
int a = 0;//定义一个全局变量a,并给初值。
声明之后你不能直接使用这个变量,需要定义之后才能使用。
第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。
糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是 int a 还是 int a=0 都只能出现一次,而那个 extern int a 可以出现很多次。
当你要引用一个全局变量的时候,你就要声明 extern int a 这时候 extern 不能省略,因为省略了,就变成 int a 这是一个定义,不是声明。
五、常量
常量是固定值,在程序执行期间不会改变。
在c中有两种简单的定义常量的方式:
-
使用#define预处理器。
#include <stdio.h> #define LENGTH 10 #define WIDTH 5 #define NEWLINE '\n' int main() { int area; const int a = 10; area = LENGTH * WIDTH; printf("value of area : %d", area); printf("%c", NEWLINE); return 0; }
-
使用const关键字
const type variable = value;
小结:
-
请注意,把常量定义为大写字母形式,是一个很好的编程习惯。
-
#define 是宏定义,它不能定义常量,但宏定义可以实现在字面意义上和其它定义常量相同的功能,本质的区别就在于 #define 不为宏名分配内存,而 const 也不为常量分配内存,怎么回事呢,其实 const 并不是去定义一个常量,而是去改变一个变量的存储类,把该变量所占的内存变为只读!
-
使用define时要注意边缘效应。
在编译时我们预想 a=2.5,实际打印结果是 3.5 原因是在预处理阶段,编译器将 a=N/2处理成 a=2+3/2,这就是 define 宏的边缘效应,所以我们应该写成 #define N (2+3)。
#define N 2+3
double a;
a = (float)N/(float)2;
//结果=3.5
在 C 语言中,单引号与双引号是有很大区别的。在 C 语言中没有专门的字符串类型,因此双引号内的字符串会被存储到一个数组中,这个字符串代表指向这个数组起始字符的指针;而单引号中的内容是一个 char 类型,是一个字符,这个字符对应的是 ASCII 表中的序列值。
六、输入&输出
scanf()和printf()
int scanf(const char *format, …) 函数从标准输入流 stdin 读取输入,并根据提供的 format 来浏览输入。
int printf(const char *format, …) 函数把输出写入到标准输出流 stdout ,并根据提供的格式产生输出。
format 可以是一个简单的常量字符串,但是您可以分别指定 %s、%d、%c、%f 等来输出或读取字符串、整数、字符或浮点数。还有许多其他可用的格式选项,可以根据需要使用。如需了解完整的细节,可以查看这些函数的参考手册。现在让我们通过下面这个简单的实例来加深理解:
#include <stdio.h>
int main()
{
float f;
printf("Enter a number: ");
// %f 匹配浮点型数据
scanf("%f",&f);
printf("Value = %f", f);
return 0;
}
#include <stdio.h>
int main( ) {
char str[100];
int i;
printf( "Enter a value :");
scanf("%s %d", str, &i);
printf( "\nYou entered: %s %d ", str, i);
printf("\n");
return 0;
}
//Enter a value :runoob 123
//You entered: runoob 123
getchar()和putchar()
int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。
int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符
#include <stdio.h>
int main( )
{
int c;
printf( "Enter a value :");
c = getchar( );
printf( "\nYou entered: ");
putchar( c );
printf( "\n");
return 0;
}
//Enter a value :runoob
//You entered: r
gets()和puts()
char *gets(char *s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。
int puts(const char *s) 函数把字符串 s 和一个尾随的换行符写入到 stdout。
#include <stdio.h>
int main( )
{
char str[100];
printf( "Enter a value :");
gets( str );
printf( "\nYou entered: ");
puts( str );
return 0;
}
占位符
c 语言中每种数据类型的输出都有各自的占位符,下面是各种数据类型的输出占位符:
short/int : %d
long: %ld (long 是 int 得修饰,不能算是一种单独的数据类型,只是比 int 多了四个字节的存储空间)
long long : %lld
char : %c
float/double : %f float 默认是 6 位小数输出;可以在 %f 中控制;例如:%.2f:输出两位小数。
char *s(字符串) :****%s
unsigned: %u (signed:有符号类型, unsigned:无符号类型;默认都是有符号的)
八进制:%o 以 0 开头
十六进制:%x 以 0x 开头
地址值/指针值:%p,***** 取指针里地址指向的地方的值,& 取改值存储位置的地址值。
二进制的输出没有占位符,只能通过其他方法。
int a = 10;
printf("这个整数是:%d", a);
printf("a的八进制输出是:%o \n", a);//输出是12
printf("a的十六进制输出:%x \n", a);//输出是a
剩余内容: 1.函数2.作用域3.数组4.指针5.函数指针6.字符串7.结构体8.共同体9.位域10.typedef11.递归12.内存管理13.排序算法14.错误处理