C语言基础


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

小结

  1. 因编译器的原因,生成的 .exe 文件打开时会一闪而过,从而观察不到其运行的结果,这是因为 main() 函数结束时,DOS 窗口会自动关闭。为了避免这个问题可在 return 0; 前加入 system(“pause”); 语句。

二、编译和执行过程

  1. 打开一个文本编辑器,添加上述代码。
  2. 保存文件为 hello.c
  3. 打开命令提示符,进入到保存文件所在的目录。
  4. 键入 gcc hello.c,输入回车,编译代码。
  5. 如果代码中没有错误,命令提示符会跳到下一行,并生成 a.out 可执行文件。
  6. 现在,键入 a.out 来执行程序。
  7. 您可以看到屏幕上显示 “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

数据类型类型说明符位数取值范围
整型int32位-2147483648~+2147483647
短整型short int16位-32767~+32768
长整型long int32位-2147483648~+2147483647
单精度浮点型float32位-3.4E-38~+3.4E+38
双精度浮点型double64位1.7E-308~1.7E+308
字符型char8位-128~+127

void类型

  1. 函数返回为空

    C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status);

  2. 函数参数为空

    C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如int rand(void);

  3. 指针指向void

    类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。

数据类型转换

  1. 数据类型转换:C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型;在 C 语言中也可以对数据类型进行强制转换;
  2. 自动转换规则:
    • a)浮点数赋给整型,该浮点数小数被舍去;
    • b)整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中;
  3. 强制类型转换形式: (类型说明符)(表达式)
#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中有两种简单的定义常量的方式:

  1. 使用#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;
    }
    
  2. 使用const关键字

    const type variable = value;

小结:
  1. 请注意,把常量定义为大写字母形式,是一个很好的编程习惯。

  2. #define 是宏定义,它不能定义常量,但宏定义可以实现在字面意义上和其它定义常量相同的功能,本质的区别就在于 #define 不为宏名分配内存,而 const 也不为常量分配内存,怎么回事呢,其实 const 并不是去定义一个常量,而是去改变一个变量的存储类,把该变量所占的内存变为只读!

  3. 使用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:无符号类型;默认都是有符号的)

八进制:%o0 开头

十六进制:%x0x 开头

地址值/指针值:%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.错误处理

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值