一.引
一、基本框架
1 /* ... */ 用于注释说明 内容不会被编译器识别, /* */ 这种格式的注释可以单行或多行
2 所有的 C 语言程序都需要包含 main() 函数。 代码从 main() 函数开始执行。
3 printf() 用于格式化输出到屏幕。printf() 函数在 "stdio.h" 头文件中声明。
4 stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。
5 return 0; 语句用于表示退出程序。
6 任何程序都要有以下框架
#include <stdio.h>
int main()
{
return 0;
}
二.变量及进制
1. 变量是一个保存数据的地方。用一个变量保存了数据,它才能参加到后面的计算中
有以下几种变量类型
| char | 通常是一个字节(八位), 这是一个整数类型。 |
| int | 整型,4 个字节,取值范围 -2147483648 到 2147483647。 |
| loat |
单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。 |
| double |
双精度浮点值。双精度是1位符号,11位指数,52位小数。 |
| void | 表示类型的缺失。 |
eg. int price =0 定义了一个变量,变量的名字是price,类型是int,初始值是01
ps: 1.0 默认为double类型
2.变量定义的一般形式:<类型名称> <变量名称>
3.变量的名字是一种标识符 由字母,数字,下划线组成且数字不可以在第一个位置上,c语言的标志词不可以做标识符
4.变量的初始化:<类型名称> <变量名称>=<初始值>
5.变量在被使用前必须要初始化,否则计算机会把内存中随机的一个数赋值给变量,从而导致结果无意义
6.表达式 :“=”是赋值运算符,有运算符的式子就叫做表达式 赋值表示一个动作
eg:a=b 即把b的值赋给a
7.字节是用于计量存储容量的一种计量单位,并且是硬件所能访问的最小单位,一个字节存储8位无符号数,储存的数值的范围为0~255
8.负数在计算机中以其绝对值的补码形式表达
9.十进制:传统的写法
十六进制:前面加0x或0X
八进制:前面加0
10.单个字符用 ‘ ’扩起来 eg:‘A’
字符串用“ ”括起来 eg: "AB" ,"A"表示’A‘和‘\0’的组合
11.ASCII是一种规定,规定了不同字符用哪个整数去表示 eg:A=65,a=97
二、输入,输出函数
一、 printf
用于输出函数,将变量的内容输出到显示器上
一、四种用法、
1、printf(“字符串\n”,); \n表示换行 eg printf(“HELLO WORD!\n”);
2、printf("输出控制符\n",输出参数); eg printf(“%d”,i) d是十进制
3、printf(“输出控制符1,输出控制符.....2\n”,输出参数1,输出参数2....);
输出控制符和输出参数要一 一对应
4、printf(“输出控制符,非输出控制符\n,输出参数”);
二. 输出控制符如下:
1、%d-------int 2、%ld------long int 3、%c------char 4、%f------float
5、%lf-------double 6、%x(或%X或%#X)-----int、long int、short int
7、%o------同6 8、%s------字符串
三、%x %X....的区别
#include<stdio.h>
int main()
{
int i = 47; //x为16进制
printf("%x\n", i); //输出结果是2f
printf("%X\n", i); //输出结果是2F
printf("%#x\n", i); //输出结果是0x2f
printf("%#X\n", i); //输出结果是0x2F %#X推荐使用
return 0;
}
二、scanf
将数据输入到变量中
用法 1、scanf("输入控制符",输入参数); eg:scanf("%d",&i); //&i 表示i的地址,&是取地址符
2、scanf("非输入控制符,输入控制符",输入参数); 非输入控制符要原样输入
注
1、使用是scanf前最好用printf提示用户以什么样的方式输入
2、 scanf尽量不要用非输入控制符,尤其是\n
3、在中间可以用一个代码把用户之前输入的数据全部消除,以便后面的输入数据
#include<stdio.h>
int main()
{
int i;
char ch;
scanf_s("%d", &i);
printf("i=%d\n", i);
while ((ch = getchar()) != '\n')
continue; //这个代码消除了用户之前所输入的数据
int j;
scanf_s("%d", &j);
printf("j=%d\n", j);
return 0;
}
三、运算符
一、算术运算符
假设变量 A 的值为 10,变量 B 的值为 20,则:
| 运算符 | 描述 | 实例 |
|---|---|---|
| + | 把两个操作数相加 | A + B 将得到 30 |
| - | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
| * | 把两个操作数相乘 | A * B 将得到 200 |
| / | 分子除以分母 | B / A 将得到 2 |
| % | 取模运算符,整除后的余数 | B % A 将得到 0 |
| ++ | 自增运算符,整数值增加 1 | A++ 将得到 11 |
| -- | 自减运算符,整数值减少 1 | A-- 将得到 9 |
以下实例演示了 a++ 与 ++a 的区别:
#include <stdio.h>
int main()
{
int c;
int a = 10;
c = a++;
printf("先赋值后运算:\n");
printf("Line 1 - c 的值是 %d\n", c );
printf("Line 2 - a 的值是 %d\n", a );
a = 10;
c = a--;
printf("Line 3 - c 的值是 %d\n", c );
printf("Line 4 - a 的值是 %d\n", a );
printf("先运算后赋值:\n");
a = 10;
c = ++a;
printf("Line 5 - c 的值是 %d\n", c );
printf("Line 6 - a 的值是 %d\n", a );
a = 10;
c = --a;
printf("Line 7 - c 的值是 %d\n", c );
printf("Line 8 - a 的值是 %d\n", a );
}
以上程序执行输出结果为: 先赋值后运算: Line 1 - c 的值是 10 Line 2 - a 的值是 11 Line 3 - c 的值是 10 Line 4 - a 的值是 9 先运算后赋值: Line 5 - c 的值是 11 Line 6 - a 的值是 11 Line 7 - c 的值是 9 Line 8 - a 的值是 9
二、关系运算符
下表显示了 C 语言支持的所有关系运算符。假设变量 A 的值为 10,变量 B 的值为 20,则:
| 运算符 | 描述 | 实例 |
|---|---|---|
| == | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 为假。 |
| != | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 |
| > | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 为假。 |
| < | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 |
| >= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 为假。 |
| <= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 |
三、逻辑运算符
一、下表显示了 C 语言支持的所有关系逻辑运算符。
假设变量 A 的值为 1,变量 B 的值为 0,则:
| 运算符 | 描述 | 实例 |
|---|---|---|
| && | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 |
| || | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 |
| ! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 |
eg:
#include <stdio.h>
int main()
{
int a = 5;
int b = 20;
int c ;
if ( a && b )
{
printf("Line 1 - 条件为真\n" );
}
if ( a || b )
{
printf("Line 2 - 条件为真\n" );
}
/* 改变 a 和 b 的值 */
a = 0;
b = 10;
if ( a && b )
{
printf("Line 3 - 条件为真\n" );
}
else
{
printf("Line 3 - 条件为假\n" );
}
if ( !(a && b) )
{
printf("Line 4 - 条件为真\n" );
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Line 1 - 条件为真 Line 2 - 条件为真 Line 3 - 条件为假 Line 4 - 条件为真
二、c语言中对真假的处理
非零是真 零是假
真是1表示 假是0表示
&&左边的表达式为假时,右边的表达式肯定不会执行
|| 左边的表达式为真时,右边的表达式肯定不会执行
四、赋值运算符
一、下表列出了 C 语言支持的赋值运算符:
| 运算符 | 描述 | 实例 |
|---|---|---|
| = | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
| += | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
| -= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
| *= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
| /= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
| %= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A |
| <<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
| >>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
| &= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 |
| ^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 |
| |= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 |
ps:1、优先级别:算术>关系>逻辑>赋值
二、除法(/)和取余(%)
除法的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商有小数部分则会抛弃掉小数部分,被除数和除数只要有一个或两个是浮点数,则商也是浮点型,不截取小数部分
eg:16/5=3 16/5.0=3.20000 -13/4=-4
取余的运算对象必须是整数,结果是整除后的余数其余数的符号与被除数相同
eg:13%3=1 13%-3=1 -13%3=-1 -13%23=-13 3%5=3
五、控制流程
一、控制流程是程序代码执行的顺序
2、流程控制的分类 顺序 选择 循环
3、选择:有选择的执行某些代码
分类: if , switch
二、选择
一、if
1、 if最简单的用法:
if (表达式)
语句 (表达式为真,语句执行,表达式为假,语句不执行)
2、if的范围:if 默认的只能控制一个语句的执行与否 (后面的else同理)
3、 if(表达式)
{
语句a
语句b
......
} (此时 if 可以控制大括号内的语句a和b)
4、if...else的用法
#include <stdio.h>
int main()
{
int i,j;
scanf("%d %d",&i,&j);
if(i>j)
printf(“i大于j\n”);
else //else即否则的意思
printf("j大于i\n");
return 0;
}
5、if ... else if....else的用法
#include <stdio.h>
int main()
{
int x
scanf("%d",&x);
if(x>0)
printf("有两个解\n");
else if(x==0)
printf("有唯一解\n");
else
printf("无解\n");
return 0;
}
ps:判断一个数的范围时,不能写成 90<=x<=100(该语句恒为真),应写成 90<=x&&x<=100
二、switch
个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。
#include <stdio.h>
int main ()
{
/* 局部变量定义 */
char grade = 'B';
switch(grade)
{
case 'A' :
printf("很棒!\n" );
break;
case 'B' :
case 'C' :
printf("做得好\n" );
break;
case 'D' :
printf("您通过了\n" );
break;
case 'F' :
printf("最好再试一下\n" );
break;
default :
printf("无效的成绩\n" );
}
printf("您的成绩是 %c\n", grade );
return 0;
}
case相当于入口,brreak相当于出口
执行时根据swith内表达式的值找到相应的case子句,并从该子句开始往下执行
而break的功能是退出swith语句去执行它下面的语句
三、循环
循环:某些代码会被重复执行
分类: for 、 while 、do....while 、break和continue
一、for
一单个for的使用:
for(.1.;..2.;..3..)
语句a ( 1- 2- a- 3 - 2- a - 3 - 2 - a - 3.............)
for的范围问题同 if 一样
eg:求10以内奇数的和
#include <stdio.h>
int main()
{
int i;
int sum = 0;
for (i = 1; i < 10; i += 2) // i+=2等价于i=i+2//
sum = sum + i;
printf("%d\n", sum);
return 0;
}
四、多个for循环的嵌套使用
for(1;2;3)
for(4;5;6)
语句a;
for(外循环的初始;外循环的条件;外循环的表达式)
for(内循环的初始;内循环的条件;内循环的表达式)
语句a
相当于把第二个for循环看作第一个for循环所控制的一个语句
顺序 1--2--内循环(内循环结束后退出)--3--2--内循环--3--2--内循环--3--2........
内循环 和单个for循环一样
五、无限循环
如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。
#include <stdio.h>
int main ()
{
for( ; ; )
{
printf("该循环会永远执行下去!\n");
}
return 0;
}
可以按 Ctrl + C 键终止一个无限循环。
二、while循环
一、格式:
while(表达式)
语句a;
同样默认控制一个语句
eg:
int sum=0;
int i =1;
while(i<101)
{
sum=sum+i;
++i;
}
等价于
int i;
int sum = 0;
for (i = 1; i < 101; ++i)
sum = sum + i;
while 和 for 可以相互转换
即 for(1;2;3)
A;
等价于 1;
while(2)
{
A;
3;
}
二、 do...while
格式:
do
{
语句.....
} while(表达式);
执行顺序: 语句-- while(表达式) (为真)--语句-- while(表达式)--语句-- while(表达式)....
do...while并不等于while和for
eg:求一元二次方程的解
#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c;
double x1, x2;
double delta;
char ch;
do
{
printf("请输入一元二次方程的三个系数\n");
printf("a=");
scanf_s("%lf", &a);
printf("b=");
scanf_s("%lf", &b);
printf("c=");
scanf_s("%lf", &c);
delta = b * b - 4 * a * c;
if (delta > 0)
{
x1 = (-b + sqrt(delta)) / (2 * a); //sqrt表示开根号
x2 = (-b - sqrt(delta)) / (2 * a);
printf("方程有两个解,%lf,%lf\n", x1, x2);
}
else if (0 == delta)
{
x1 = x2 = (-b) / (2 * a);
printf("方程有唯一解x1=x2=%lf\n", x1);
}
else
printf("方程无解\n");
printf("你想继续吗(Y/N)\n");
scanf_s(" %c", &ch); //%c前面必须加一个空格
} while ('y' == ch || 'Y' == ch);
return 0;
}
四、break和continue
一、break
break如果拥有循环是用来终止循环
break如果用于swith则是用于退出(终止)swith
break不能直接用于if,除非 if 属于循环内的一个子语句
#include<stdio.h>
int main()
{
int i;
for (i = 0; i < 3; ++i)
{
if (i > 1)
break; //break虽然是属于if内的语句,但是作用是终止外部的for语句
printf("hello\n");
}
return 0;
break用于多个for循环嵌套,则它只能终止距离它最近的循环
同样break用于多层swith,它只能终止距离它最近的swith
二、continue
用于跳过本次循环余下的语句,转去判断是否需要执行下次循环
六、数组
int a[5]={1,2,3,4,5};
上面定义了一个数组
a是数组的名字,5表示数组元素的个数
并且这5个元素按顺序分别用 a[0] a[1] a[2] a[3] a[4] 表示
功能:可以用来保存大量同类型的数据
二、一维数组
为n个变量连续分配存储空间
所有变量的数据类型必须相同
所有变量所占的字节大小必须相等
有关数组的一些操作:
初始化
完全初始化 int a[5]={1,2,3,4,5};
不完全初始化 int a[5]={1,2,3}; 未被初始化的元素自动为零
不初始化 所有的元素都是垃圾值
清零 int a[5]={0} ; 将里面所有元素变为零
错误写法
int a[5];
a[5]={1,2,3,4,5};
只有在定义数组的同时才可以整体赋值
一些琐碎的知识
一、强制类型转换
(数据类型)(表达式) 可以将后面的数据强制转化为前面的数据类型
eg:for(i=1;i<=100;++i)
sum=sum+ 1/i
因为1和i都是整形,所有结果会舍弃小数,使得结果恒为0
此时可以写成 1/ (float)(i) 最好可以写成1.0 /i
可以将后面的1/i转换为浮点数,从而保留小数
eg (int)(4.5+2.2) 最终值是6
(float)(3+2) 最终值是5.00000
二、浮点数存错所带来的问题
float和double都不能保证可以精确的存储一个小数
eg、有一个浮点型变量x,如何判断x的值是否为0
if( |x-0.00001| <0.00001)
是0
else
不是0
ps:循环更新的变量不能定义为浮点型
三、自增(自减)
前自增---- ++i
后自增---- i++
相同之处:最终都使 i 的值加1
不同之处:++i 整体表达式的值是 i 加1之后的值
i++整体表达式的值是 i 加1之前的值
1、我们编程时要尽量避免前自增和后自增的差别
2、最好 i++和++i 单独成为一个语句,不要把他作为一个完整复合语句的一部分使用
四、运算符补充
1、三目运算符
格式 A?B:C
等价于 if(A)
B;
else
C;
二、逗号表达式
格式 (A,B,C,D)
功能: 1、从左到右执行
2、最终表达式的值是最后一项的值
该博客围绕C++编程展开,介绍了基本框架、变量及进制,阐述了输入输出函数printf和scanf的用法,讲解了算术、关系、逻辑等运算符,还介绍了控制流程,包括选择(if、switch)和循环(for、while等)结构,以及数组操作和一些琐碎知识,如强制类型转换等。
1275

被折叠的 条评论
为什么被折叠?



