C语言基本概念

第一部分:第一个C语言程序

#include <stdio.h>//预处理 引入用于输入输出函数的头文件
//任何C程序都需要有main函数
int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    return 0;
}

第二部分:程序基础知识,顺序程序

顺序结构是最简单的程序结构,它的执行顺序是自上而下,依次执行.
例如,从键盘读入3门成绩,求这三门成绩的总成绩和平均成绩

int main() {
    int score1;
    int score2,score3;
    printf("Please input three scores:\n");
    //终端格式化输入函数 注意格式输入的写法问题(如下面第二幅图就是错误的输入格式),否则很容易出现问题
    scanf("%d %d %d", &score1, &score2, &score3);
    int sum = score1 + score2 + score3;
    double average = (double)sum / 3;
    printf("sum = %d\n",sum);
    printf("average = %.1lf\n",average);
}

图1
图2

内存

计算机执行程序时,组成程序的指令和程序所操作的数据需要存储在某个地方,这个地方即为计算机的内存.可以直接操作的内存最小单位是字节(byte),一个字节由8个位(bit)组成,每个字节都有唯一的地址,如果存储无符号整数,一个字节可以表示0~255范围的数字

变量,赋值=运算,取地址&运算

变量是计算机里一块特定的内存,他是有一个或多个连续的字节所组成的.包括多种不同的类型.它可以存储整数,浮点数,字符等.每个变量都有一个名称,变量名由1个或多个字符组成.其中可以包括大小写字母,数字,下划线,变量名不能以数组开头;变量名不能与C语言关键字相同.
使用”=”为变量进行赋值,可以在变量定义的时候进行赋值,也可以在后续语句中未变量赋值.
使用”&”获取变量所在的内存地址.

int main() {
    //变量类型 + 变量名  定义变量
    int a = 12345;//变量定义时进行赋值
    double A_DOUBLE_variable;
    char ch123;

    A_DOUBLE_variable = 35.234243;
    int *a_address = &a;  //取变量a的地址&a,将其存储在变量a_adress中
    printf("a = %d, a_address = %x\n", a, a_address);
    printf("A_DOUBLE_variable = %lf\n", A_DOUBLE_variable);
    return 0;
}

变量的类型

这里写图片描述

输入与输出

C语言的输入(从键盘输入数据)使用scanf函数,输出(将数据输出到屏幕上)使用printf函数.
使用它们需要引入头文件stdio.h
scanf(“%d %d %d”, &a,&b,&c);
printf(“a=%d b=%d c=%d”, a,b,c);
这里写图片描述

基本运算

这里写图片描述
括号()运算符可改变运算的优先级,带括号的表达式从内到外计算.

数学函数

这里写图片描述
调用数学函数时,需要引用数学头文件 math.h

常量

在计算机程序运行时,往往需要定义一些不会被程序修改的量,这些量需要定义为常量,例如 圆周率PI 。C语言中,有两种方法定义常量。
方法1,在预处理时定义: #define PI 3.14159265 这种定义方法将PI定义为“3.14159265”的取代符号,后面的程序中,只要出现PI,编译器会将它 替换为“3.14159265”。
方法2,定义为常量变量: const double PI = 3.14159265; 这种定义方法将PI定义为值无法修改的变量,即变量PI增加了const修饰后,后续的程序就无法对 变量PI进行修改了,变量PI就成为了常量PI。

类型转换

类型转换包括显示转换的强制类型转换与隐式类型转换,
1.显示的强制类型转换:把变量从一个类型转换成另一种类型.将目标类型放在变量前面的括号中.
2.隐式类型转换:发生在二元运算或者赋值运算时.
a.在二元运算时,将值域较小的操作数类型转换成值域较大的操作数类型
b.在赋值运算时,当赋值运算符右边的表达式与左边的变量类型不同时,即进行隐式类型转换.

int main() {
    int total_score = 200;
    double average1 = total_score / 3; //没有类型转换,结果错误(丢失小数)
    double average2 = (double)total_score / 3;//显示的强制类型转换
    double average3 = total_score / 3.0;//二元运算时的隐式类型转换

    printf("average1 = %lf\n",average1);
    printf("average2 = %lf\n",average2);
    printf("average3 = %lf\n",average3);

    double test1 = total_score;//赋值时的隐式类型转换,值域小的整型赋值到值域大的浮点型
    int test2 = average2;//赋值时的隐式类型转换,值域大的浮点型赋值到值域小的整型
    printf("test1 = %lf,  test2 = %d\n",test1,test2);
    return 0;
}

结果: 这里写图片描述

无符号类型的变量

有些数据总是非负的.例如一个班的学生人数.对于每个带符号的整数类型,都有一个对应的无符号整数类型,同类型的有符号与无符号数据占用的内存空间相同.同类型的无符号变量比有符号变量存储范围大一倍,因为最高位是符号位,不参与计算.
浮点数类型数据没有无符号类型.
这里写图片描述

数据溢出

当向某变量中存储超过其存储范围的数据时,就会发生数据溢出现象

int main() {
    char ch1 = 200;
    unsigned char ch2 = 200;
    printf("ch1 = %d ch2 = %d\n",ch1, ch2);
}

这里写图片描述

-56是怎么计算出来的? 200的二进制数据为11001000; ch1是有符号字符型数据.值域为-128~128.200已经超出值域范围.所以取200的补码显示(反码 + 1).取反码的时候保持最高位为符号位不变,即10111000转成10进制为-56.

第三部分:条件判断语句,分支程序

关系运算符

这里写图片描述

逻辑运算符

这里写图片描述

运算符的优先级

这里写图片描述

第四部分:循环语句,循环程序

while循环

在while循环中,只要while后()中的逻辑表达式等于true,就重复执行while后的{}中的语句块.

for循环

一般明确循环重复执行的次数时,使用For循环.

递增与递减运算符

递增与递减运算尽可能的独立成一个句子,避免与其他计算放在一起执行.

break语句

break语句的作用是终止循环体内的语句块.break经常出现在循环中的条件分支,从而在某条件成立时,终止循环.

continue语句

continue语句的作用是终止循环体内当前的循环,当前循环continue后的语句不在执行,直到跳到循环的下一次开始.continue经常出现在循环中的条件分支,从而在某条件成立时,终止本次循环.

猜你喜欢

转载自blog.csdn.net/uziandkobe/article/details/80222458