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语言编程》 林锐
- redefinition :重复定义
- multiple:多种的,多重
- 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语言技能树
顾无言195: 有没有大神有这道题的源代码啊?给我发一下吧,求求了,有偿
2301_79704350: 为什么运行不了啊?
CSDN-Ada助手: Vue入门 技能树或许可以帮到你:https://edu.csdn.net/skill/vue?utm_source=AI_act_vue