C语言基础知识

C语言基础

编译程序

  1. gcc xx.c,他会默认生成a.out的可执行文件,在a.out所在目录,执行./a.out
  2. gcc xx.c -o xx,生成一个xx可执行文件,注意不要命名成xx.c,这样会覆盖原先xx.c文件内容
  3. gcc xx.c -o xx -g -Wall的意思是开启所有的语法警告
  4. gcc之检查语法错误
  5. 每次修改完,c程序都必须要执行一次gcc
  • /如果觉得gcc太麻烦,写一个shell脚本/

hell world程序

int main()
{
    return 0;
}

  1. 可执行程序一执行,就会找一个叫做main的函数然后运行main大括号里面的语句
  2. 一个.c文件有且只能有一个main的函数
  3. 如果一个函数碰到return这个单词就代表这个函数运行结束.return后面的语句将永远不会被执行.
  4. 如果是main函数,他可将前面int省略.return也是可以省略的.
  5. main(int argc,char *argv[])
  6. include<stdio.h>是一个C语言标准输入输出库.

注释

  1. //代表单行注释
  2. /* code/注释多行:注意:/ * /*/ 第一个/ *会遇到第一个 * /匹配

注释使用情况

  1. 注释代码
  2. 解释代码
  3. 写清楚文件名,文件产权copyright,文件制作者,如果是某人:要写清联系方式

printf

  • 打印函数:打印双引号""里面的语句,\n:转义字符,代表换行

代码格式

main()
{
    
    
}

  • 注意:每碰到一个{,就要换行,再来一个tab键.

常量

  1. 1,2,3,4:整型常量
  2. 'a','b','c','d':字符常量
  3. 1.2,2.2:浮点常量
  4. "hello world":字符串常量
  5. 0xff1:地址常量

常量的特性

  1. 常量不会改变
  2. 常量不能作为左值
  3. 8,const(只读常量),define(宏常量)

变量

变量的特点

  1. 可以改变的量
  2. 可以作为左值,也可以作为右值

变量的定义

  • 在shell脚本里:变量名=值
  • 在C语言里面:数据类型+变量名;
  • 同时定义多个同种类型的变量;数据类型 变量1,变量2;

数据类型

  1. 整型数据类型:int
  2. 字符数类型:char
  3. 浮点类型:float(单精度),double(双精度)
  4. float类型的变量精确到7位

数据类型的作用

  1. 标志着后面的变量具体是接收什么类型的值
  2. 这个变量在内存中占几个字节
  • int:4
  • char:1
  • float:4
  • double:8

整型变量

  1. int value=8;
  2. int value;value=8;

字符变量

  1. char ch='c';
  2. char ch;ch='d';

浮点变量

  1. float f1=1.2;
  2. float f1;f1=1.2;

变量的使用

  1. int value;value=8;

标识符的命名规范

硬性规范

  1. 不能用数字开头
  2. 只能由字母,下划线好数字组成
  3. 不能与C语言关键字相同

建议规范

  1. 不能用拼音,多查字典
  2. 尽量使用驼峰命名法:numOfStudent,或者num_of_student
  3. 见名知义

printf具体用法

int a=6;
float=9.8;
printf("a=%d,b=%f\n",a,b);
  1. %m.nf
  • m<=n+1+整数实际部位的位数,m无效
  • m>n+1+整数实际部分的位数,m有效,左边以空格补全

地址

  1. 内存:字节:Byte是计算机存储的最小单位.
  2. 1M=1024KB,1KB=1024Byte,1Byte=8bit
  • 位:bit:一个字节占八位
  • 地址:是每一个字节所对应的编号

进制

  1. 二进制:0~1:以0B,0b开头
  2. 八进制:0~7:以0开头:
  3. 十进制:0~9
  4. 十六进制:0~ f,或者0~F:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f:0x开头

大端小端存储法

小端法

  • 低位上的数存储在低的地址所对应的字节

大端法

  • 低位上的数存储在高的地址所对应的字节
  • 用处:一般网络传输内的时候

打印特殊字符

  1. ":\ " printf(""shangqian"\n");
  2. ':' '或'printf("'shangqian'\n");
  3. %:%% printf("%%%d\n",a);
  4. \ :\ \ printf("%d\ \n",a);

字符与ASCII编码

  1. 字符是一个特殊的整型,占8位
  2. '\0'=0,' '=32,'0'=48 'A'=65 'a'=97
  3. 全球unicode

scanf

  1. 基本用法
#include "stdio.h"
int main()
{
    int a;
    scanf("%d",&a);
    printf("a=%d\n",a);
    returnn 0;
}
  • 注意点 scanf,后面必须是取变的地址
  • 一个变量必须先定义出来再进scanf
  • 不要在scanf里多弄花样。
  1. 同时输入多个变量
scanf("%d%d",&a,&b);
  1. %d,%f,%c,%lf.%lf是输入double类型的数据

getchar()和putchar()

char ch;
ch=getchar();
putchar(ch);
putchar('\n');
//printf("ch=%c\n",ch);

数据类型转换

  1. 隐式转换:精度小的===>精度大的
    char===>short int===>int===>float===>double
  2. 强制类型转换: (数据类型)变量/常量
int a=9;
int b=8;
float c=(float)a/b;
printf("c=%f\n",c);

运算符

  1. 注意点:计算机只进行相同类型数据运算,最后算出来的结果也与他们相同的数据类型
    2.隐式转换:精度小的===>精度大的
    char===>short int===>int===>float===>double

算数运算符

  1. +     -   *  /   %  ++
    
  2. %:%左右两边的数都是整数
  • 后缀++ 前缀++ 前缀-- 后缀--

位运算符

1.|:

3:0011
5:0101
|:为0111 为7
  1. &:
3:0011
5:0101
&:0001 为1

  1. ^:
3:0011
5:0101
^ 0110 为6
  1. ~:按位取反
3:0011
~:1100 为-4

  • +7
  1. 原码:0000 0111
  2. 反码:0000 0111
  3. 补码:0000 0111
  • -7
  1. 原码:1000 0111
  2. 反码:1111 1000
  3. 补码:1111 1001
  • 数据在内存中是以数据的补码形式存在.
  • 正数取反
  1. +7
  • 原码: 0000 0000 0000 0000 0000 0000 0000 0111
  • 反码:0000 0000 0000 0000 0000 0000 0000 0111
  • 补码:0000 0000 0000 0000 0000 0000 0000 0111
  • 取反补码:1111 1111 1111 1111 1111 1111 1111 1000
  • 反码为:1111 1111 1111 1111 1111 1111 1111 0111
  • 原码为:1000 0000 0000 0000 0000 0000 1000
  • +7取反为-8
    2.-7
  • 原码: 1000 0000 0000 0000 0000 0000 0000 0111
  • 反码:1111 1111 1111 1111 1111 1111 1111 1000
  • 补码:1111 1111 1111 1111 1111 1111 1111 1001
  • 取反补码为:000 0000 0000 0000 0000 0000 0110
  • 反码:000 0000 0000 0000 0000 0000 0110
  • 补码:000 0000 0000 0000 0000 0000 0110
  • 结果:-7取反为+6

左移

正数左移

  • 3左移两位
  • 原码:0000 0011
  • 反码:0000 0011
  • 补码:0000 0011
  • 左移两位补码为:0000 1100
  • 反码为:0000 1100
  • 原码为:0000 1100
  • 结果为12

正数右移

  • 3右移两位
  • 原码为0000 0011
  • 反码:0000 0011
  • 补码:0000 0011
  • 右移两位补码为:0000 0000

负数左移

  • -3左移两位
  • 原码:1000 0011
  • 反码:1111 1100
  • 补码:1111 1101
  • 左移两位补码为:1111 0100
  • 反码为:1111 0011
  • 原码为:1000 1100
  • 结果为-12

负数右移:以符号位补全

  1. -3右移两位
  • 原码:1000 0011
  • 反码:1111 1100
  • 补码:1111 1101
  • 右移两位补码为:1111 1111
  • 反码为:1111 1110
  • 原码为:1000 0001
  • 结果为-1
  1. -6右移两位
  • 原码:1000 0110
  • 反码:1111 1001
  • 补码:1111 1010
  • 右移两位补码为:1111 1110
  • 反码为:1111 1101
  • 原码为:1000 0010
  • 结果为-2

char:占1个字节

  • 表示范围为-128~127
char ch=128;
printf("ch=%d\n",ch);

  • 结果为-128
char ch=129;
printf("ch=%d\n",ch);

  • 结果为-127

unsigned char

unsigend char a=-1;
printf("a=%d\n",a);

  • 结果为:a=255;
  • -1的原码:1000 0001
  • -1的反码:1111 1110
  • -1的补码:1111 1111
  • 由于unsigne char 是无符号数,所以不用再回原码,直接取补码;

赋值运算符

num+=i==>num=num+i;
num>>=2==num=num>>2;

计算数据类型所占字节长度

  • printf中%p是打印地址
  • printf("int所占字节长度=%ld\n",sizeof((num)));

关系运算符

  • <, >, >= , <= ,!= , ==
  • 在计算当中,关系运算符构成的运算,我们可以看成一个事件,如果这个事件成立,其结果(逻辑结果[0/1])1,如果事件不成立,其结果为0;

逻辑运算符

  1. 事件1&&事件2:并且,事件1成立并且事件2也成立,整个逻辑结果才为1;否则,整个逻辑结果为0;
  2. 事件1||事件2:或者,事件1成立或者事件2也成立,整个逻辑结果才为1;否则,整个逻辑结果为0;
  3. !事件:非,如果事件成立,逻辑结果为1,!1,整个结果为0;否则,逻辑结果为1.
  • 进阶:事件1&&事件2:如果事件1不成立,就不会执行&&后面的运算.
  • 事件1||事件2:如果事件1成立,就不会执行||后面的运算.
  • 5>3&&8<4-!0 >1.
    5>3为1,!0为1,4-!0=3,8<3=0,1&&0=0;

推荐阅读更多精彩内容

  • 1.编译程序(1)gcc xx.c,他会默认生成一个a.out的可执行文件,在a.out所在目录,执行./a.o...
    萌面大叔2阅读 141评论 0 1
  • 1.编译程序 (1)gcc xx.c,他会默认生成一个a.out的可执行文件,在a.out所在目录,执行./a....
    萌面大叔2阅读 38评论 0 1
  • •1 C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使读者对c语...
    CONLYOUC阅读 5,909评论 10 63
  • c语言中怎样用scanf()读入带空格的字符串 c语言编译常识 gcc hanshu.c -o hanshu:...
    ie大博阅读 162评论 0 0
  • C语言预课 字节讲解 大端存储法:在高位存储低字节小端存储法:在低位存储高字节 ASC码表——共255个字符 ‘\...
    I踏雪寻梅阅读 120评论 0 0