C语言基础语法第一天

目录:

  • C语言预备知识

  • C语言标准函数

  • 编译过程

  • 变量

  • IEE754

  • 运算

  • 解一元二次方程练习

C语言预备知识:

C语言标准函数库

编译过程

  • 预处理(Preprocessing):用于将所有的#include头文件以及宏定义替换成真正的内容。gcc的预处理是预处理器cpp来完成的。

X文件名文件大小代码行数

预处理前

test.c

146B

9

预处理后

test.i

17691B

857

  • 编译(Compilation):将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。

  • 汇编(Assemble): 将上一步的汇编代码转换成机器码(machine code)产生目标文件

  • 链接(Linking):链接过程将多个目标文以及所需的库文件链接成最终的可执行文件(executable file)

数据类型

变量(Variable):表示内存中的一个存储区域(不同的数据类型,占用的空间大小不同)

变量的初始化(initialized)就是变量赋值

类型

英文表示

存储字节

整型

int

4

短整型

short int

2

长整型

long int

8

单精度浮点数

(6位小数)

float

4

长精度浮点数

(15位小数)

double

8

字符

char

1

C语言中没有字符串类型,使用字符数组char[]表示字符串

变量类型

生存周期

作用域

局部变量

auto:自动变量,离开定义函数立即消失

只作用于该函数内部

register:寄存器变量,离开定义函数立即消失

static:静态变量,离开定义函数仍然存在

全局变量

在程序运行期间一直存在

static:静态变量,仅限于本文件内部调用

extern:外部存储变量,用于声明本文件将要用到的其他文件的变量

进制注意事项:

    C语言规定八进制前加0,十六进制前加0x或0X,十进制前什么也不加

    在汇编中:数字后加字母B表示二进制(binary),加字母o表示八进制数(octonary),加字母D表示十进制数(decimal system),加字母H表示十六进制数(hexdecimal)。

    printf的用法:

  • %d表示十进制输出

  • %x或%X表示以十六进制输出

  • %o表示以八进制输出

浮点数的写法:

float x = 3.2 ;//传统写法
float x = 3.2e3 ;//科学计数法3200
float x = 123.45e-2;  //科学计数法 1.2345 (后者默认double)

字符:

  • 单个字符使用单引号括起来'A'

  • 字符串用双引号括起来:“A” 表示 ‘A’和‘\0’的组合

存储方式:

整数是以补码的形式转化为二进制补码的形式存储在计算机中

实数是以IEE754标准转化为二进制代码存储在计算机中的

字符实质上与整数的存储方式相同

const修饰常变量:值不能被修改,在整个作用域中都维持原值

int main()
{  
    const int a = 1;  //a的值不允许修改
}

#define定义的标识符常量

    该标识符常量在程序中是个定值,通常用于表达数组容量或涉及数学的常量。

***#define***
#define SIZE 10
 

  • sizeof运算符: 用于获取数据类型或者表达式的长度

sizeof(变量名)
sizeof(数据类型名)
sizeof 变量名

注意:

  •  sizeof(结构体) :理论上结构体各个成员在内存中是连续存放的,和数组非常类似,但是,结构体占用的总大小不一定等于全部成员变量占用内存大小之和。在编译过程中,为了提高内存寻址的效率,各个成员之间可能会存在缝隙,用sizeof可以得到结构体在内存中的总大小,sizeof(结构体名)或sizeof(结构体变量名)都可以。

  • 不要对void使用sizeof: void是无值型或空类型,不知道存储空间大小的类型,编译器也不能确定它的大小。

  • 不要在子函数中对字符指针用sizeof:如果在子函数中用sizeof(pstr),得到的不是字符串占用内存的字节数,而是字符指针占用内存的字节数(8字节)

  • 不要在子函数中对结构体指针用sizeof :同字符指针

  • signed :第一位代表正负,剩余代表大小 signed  int范围-128~127,默认情况

  • unsigned:无符号,所有位都为大小,没有符号 unsigned int 范围0~255

数据类型

字节数

取值范围

char

1

-128~127

unsigned char2

1

0~255

short

2

-32768~32767

unsigned short

2

0~65535

int

4

-2147483648~2147483647

unsigned int

4

0~4294967295

long

4

-2147483648~2147483647

unsigned long

4

0~4294967295

long long

8

-9223372036854775808~9223372036854775807

unsigned long long

8

0~18446744073709551615

数据类型

字节数

取值范围(绝对值)

float

4

1.17549*10^-38~3.40282*10^38

double

8

2.22507*10^-308~1.79769*10^308

long double

12

2.22507*10^-308~1.79769*10^308
 

代码规范化: 《高质量c语言编程》 林锐

  1. redefinition :重复定义
  2. multiple:多种的,多重
  3. initialization :初始化

ASCII编码:

scanf补充:

int main()
{ 
    char ch;  
    scanf("m%c", &ch);  //输入ma       //m为非输入控制符 
    printf("%d\n", ch); 
    return 0;
}
//输出97

多个scanf读取数据:读取中间非法输入(脏数据)

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
int main()
{ 
    int a , b;
    char ch;//存放脏数据 
    scanf("%d", &a); 
    printf("%d\n", a); //避免第一次输入的脏数据影响第二次读入 //如果第一次后面存在脏数据将其读入 
    while ((ch = getchar()) != '\n') 
    { 
        continue; 
    } 
    scanf("%d", &b); 
    printf("%d\n", b); 
    return 0;
}

赋值运算符

说明

示例

=

普通赋值运算符

val = 2

+=

加并赋值操作

val += 2 等价于 val = val + 2

-=

减并赋值操作

val -= 2 等价于 val = val - 2

*=

乘并赋值操作

val *= 2 等价于 val = val * 2

/=

除并赋值操作

val /= 2 等价于 val = val / 2

%=

取余并赋值操作

val %= 2 等价于 val = val % 2

<<=

左移并赋值操作

val <<= 1 等价于 val = val << 1

>>=

右移并赋值操作

val >>= 1 等价于 val = val >> 1

&=

按位与并赋值操作

val &= 1 等价于 val = val & 1

^=

按位异或并赋值操作

val ^= 1 等价于 val = val ^ 1

|=

按位或并赋值操作

val |= 1 等价于 val = val | 1

注意:

  •     取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同。

  • C语言没有“之间”,“中间”,“之内”的关系运算符,只能使用与或操作进行替换

优先级:

    算术 > 关系 > 逻辑 > 赋值

注意:C语言对真假的处理

    非零是真

    零是假

    真用1表示,假用0表示

变量名++;// 表示在本次使用变量后再自增;
++变量名; // 表示在本次使用变量前自增;
变量名–-;// 表示在本次使用变量后再自增;
–-变量名; // 表示在本次使用变量前自减;

逗号也是运算符:

#include <stdio.h>
int main()
{     //3, 4, 5;//这是一条语句 //把上面这条语句的值赋值给变量a 
    int a = (3, 4, 5); 
    printf("a=%d\n", a);
}
//输出结果:a=5// 因为a的值是整条语句的值,而整条语句的值是最后那个逗号后面的值

#include <stdio.h>
int main()
{ 
    int a=3, b=4, c=5; 
    int x=0;  
    int y=(x=a+b),(b+c);     // 使用逗号隔开,使得y=x=a+b 
    printf("第一个y=%d\n", y);  
    y=((x=a+b),(b+c));         // 如果用逗号二开,返回值就会变成最后那个表达式额值  printf("第二个y=%d\n", y);
}
// 输出结果:// 第一个y=7 //     第一个y=9

三目运算符:

表达式1?表达式2:表达式3;

先执行表达式1,如果表达式1的结果为真,那么执行表达式2,整体的运算式的结果是表达式2的结果。如果表达式1的结果为假,则执行表达式3,结果也为表达式3的结果。

练习:解一元二次方程(C语言)

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include <math.h>
//一元二次方程
int main()
{
  int a;  //二次项系数
  int b;  //一次项系数
  int c;  //常数项
  printf("请分别输入二次项系数,一次项系数,常数(中间空格隔开)\n");
  scanf("%d %d %d", &a, &b, &c);
  float judge;  //根据b的平方-4ac来判断是否有解及解的个数
  judge = b * b - 4 * a * c;
  printf("%f\n", judge);
  float x1, x2; //  方程的解
  if (judge < 0)
  {
    printf("此方程无解\n");
  }
  else if (judge > 0) 
  {
    printf("此方程有两个不同的解\n解为:\n");
    x1 = (-b + sqrt(judge)) / 2 * a;
    x2 = (-b - sqrt(judge)) / 2 * a;
    printf(" X1:%f\n X2: %f\n", x1, x2);
  }
  else  if(judge == 0) 
  {
    printf("此方程有两个相同的解\n");
    x1 = (-b - sqrt(judge)) / 2 * a;
    x2 = (-b + sqrt(judge)) / 2 * a;
    printf(" X1=X2: %f", x1);
  }
  return 0;
}

参考资料:郝斌老师C语言

                《算法设计与分析》第二版

                C语言技能树

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值