17.12.31~18.1.1
[TOC]
第二章:设计入门
C程序:打印一行文字
//打印一行文字
#include <stdio.h>
int main(void)
{
printf("第一个程序\n");
return 0;
}
-
#include <stdio.h>
向C预处理程序发出指令。包含标准输入输出头文件到程序源中。-
int main(void)
integer整数。main函数。
-
- 每一条语句都必须以分号
;
(语句结束符)结尾。 -
""
为字符串的边界。
转义序列 | 描述 |
---|---|
\n | 换行 |
\t | 水平制表 |
\a | 响铃报警 |
\\ | 字符串中插入反斜线 |
" | 字符串中插入双引号 |
每一个函数的函数体在其定义的花括号内要有统一的缩进量。
C程序:两个整数求和
//对两个整数求和
#include <stdio.h>
int main(void)
{
int integer1, integer2, sum;
printf("输入第一个整数\n");
scanf("%d" , &integer1);
printf("输入第二个整数\n");
scanf("%d" , &integer2);
sum = integer1 + integer2;
printf("两整数之和为%d\n", sum);
return 0;
}
- 第4行
int integer1, integer2, sum;
为定义变量; -
scanf
函数用来从标准输入流读入数据。实参%d
为格式控制字符串(易忽略双引号),%
表示一个转换说明符的开始,d
代表十进制整数。“与”符号&
称为取地址运算符,后面紧跟变量名,获取紧随其后变量的储存地址。scanf
函数中变量名前必须加&
;
定义了一个int型变量,但是你的输入计算机是没法控制的。int型在内存中开辟的大小有限,你如果输入一大串数,如果你进行了异常判断当然没问题,但是你没进行异常判断所以scanf会存在溢出风险,一旦发生溢出不处理,程序就会崩溃,这是为什么报错的原因。而scanf_s输入流则不同,它就是为了避免这种情况而诞生的,比如说输入char a[20] scanf_s("%s",a,20);这样一来,编译器就知道了这个输入长度最多为20,相当于帮你处理了异常。
因此于预处理器定义加上_CRT_SECURE_NO_WARNINGS
或使用 scanf_s
以解决C4996错误;
- 适当精简为
printf("两整数之和为%d\n, integer1 + integer2");
算术运算符
C运算 | 算术运算符 | C表达式 |
---|---|---|
加法 | + | a + b |
减法 | - | a - b |
乘法 | * | a * b |
除法 | / | a / b |
求余 | %(操作数为整数) | a % b |
() | a + (b + c) |
()
优先级最高,*
/
%
优先级次之。
C程序:相等和关系运算符
相等运算符 | C相等运算符 | C条件例子 |
---|---|---|
= | == | a == b |
≠ | != | a != b |
关系运算符 >
<
>=
<=
优先级大于相等运算符。
//比较两个整数大小
#include <stdio.h>
int main(void)
{
int num1, num2;
printf("输入两个数来比较大小\n");
scanf_s("%d%d", &num1, &num2);
if (num1 == num2) {
printf("两个数大小相等\n");
} // end if
if (num1 != num2) {
printf("两个数不相等\n");
} // end if
if (num1 > num2) {
printf("第一个数大\n");
} // end if
if (num1 < num2) {
printf("第二个数大\n");
} // end if
if (num1 >= num2) {
printf("第一个数大于等于第二个数\n");
} // end if
if (num1 <= num2) {
printf("第一个数小于等于第二个数\n");
} // end if
return 0;
}
运算符优先级降序排列及关键字表
运算符优先级 |
---|
() |
* / % |
+ - |
> < >= <= |
== != |
= |
关键字表 | |||
---|---|---|---|
auto |
double |
int |
struct |
break |
else |
long |
switch |
case |
enum |
register |
typedef |
char |
extern |
return |
union |
const |
float |
short |
unsigned |
continue |
for |
signed |
void |
default |
goto |
sezeof |
volatile |
do |
if |
static |
while |
C99新规范关键字 _Bool
_Complex
_Imaginary
inline
restrict
作业
判断三者最小
//判断三个整数最小值
#include <stdio.h>
int main(void)
{
int a, b, c;
printf("输入3个整数\n");
scanf_s("%d %d %d", &a, &b, &c);
if (a < b) {
if (a < c) {
printf("最小为%d\n", a);
}
}
if (b < a) {
if (b < c) {
printf("最小为%d\n", b);
}
}
if (c < b) {
if (c < a) {
printf("最小为%d\n", c);
}
}
return 0;
}
第三章:结构化的C程序设计
七种控制结构
顺序结构、选择结构(if
if...else
switch
)、循环结构(while
do...while
for
)。
if...else语句
//成绩通过检测
#include <stdio.h>
int main(void)
{
int grade;
scanf_s("%d", &grade);
if (grade >= 60)
printf("passed\n");
else
printf("failed\n");
return 0;
}
其中的 if...else
函数体可替换为
printf("%s\n", grade >= 60 ? "passed" : "failed");
-
?
为条件运算符,需要 ”条件“、”条件为真表达的值“、”条件为假表达的值“ 三个操作数; -
%s
为转换说明符,打印出一个字符串;
更进一步,?
的第二、第三操作数能是可执行的语句,如:
grade >= 60 ? printf("passed\n") : printf("failed\n");
这样使用的功能比 if...else
语句更强。
if...else语句的嵌套
//得分成绩
#include <stdio.h>
int main(void)
{
int grade;
scanf_s("%d", &grade);
if (grade >= 90)
printf("A\n");
else
if (grade >= 80)
printf("B\n");
else
if (grade >= 70)
printf("C\n");
else
if (grade >= 60)
printf("D\n");
else
printf("failed\n");
return 0;
}
为避免代码的右向偏移,可写为:
//得分成绩
#include <stdio.h>
int main(void)
{
int grade;
scanf_s("%d", &grade);
if (grade >= 90)
printf("A\n");
else if (grade >= 80)
printf("B\n");
else if (grade >= 70)
printf("C\n");
else if (grade >= 60)
printf("D\n");
else
printf("failed\n");
return 0;
}
复合语句或语句块(block)
可放置单个语句的任何地方,都可通过 {}
放置多个语句,如:
if (grade >= 60)
printf("passed\n");
else {
printf("faild\n");
printf("You must take this course again.\n");
}
同样的,可放置单个语句的任何地方,也可以不放置任何语句,用分号 ;
占位。
while语句
while语句的循环体只能是一条语句或一个复合语句。
//寻找第一个大于100的3的幂
#include <stdio.h>
int main(void)
{
int a;
a = 3;
while (a <= 100)
a = a * 3; //end while
printf("%d\n", a);
return 0;
}
案例:计数控制的循环
//求解平均分(非浮点数)
#include <stdio.h>
int main(void)
{
int counter, grade, total, average;
total = 0, counter = 1; //注意对变量的初始化
while (counter <= 10) {
printf("输入第%d位学生的成绩:",counter);
scanf_s("%d", &grade);
total = total + grade;
counter = counter + 1;
} //end while
average = total / 10;
printf("\n10位学生的平均成绩为:%d\n", average);
return 0;
}
案例:标记控制的循环
//任意数目的成绩值浮点平均数
#include <stdio.h>
int main(void)
{
int grade, counter, total;
float average; //定义average为浮点数据
total = 0, counter = 1;
printf("单个输入学生的成绩,以“-1”结束:");
scanf_s("%d", &grade);
while (grade != -1) {
total = total + grade;
counter = counter + 1;
printf("单个输入学生的成绩,以“-1”结束:");
scanf_s("%d", &grade);
}
if (total == 0) //考虑除数为零的情况
printf("\n没有输入学生成绩,请重新运行程序\n");
else {
average = (float)total / counter; //强制类型转换运算符
printf("\n%d位学生的平均成绩为:%.2f\n", counter,average);
}
return 0;
}
除数为零的情况要特别考虑,予以排除;
float
为浮点数据类型,输出时,利用转换说明符%.2f
打印(只用于printf
)出精度为2的浮点数;强制类型转换运算符
(flaot)
为它的操作数创建一个浮点数据类型临时副本,是显示的类型转换。强制类型转换符是一个一元运算符,只有一个操作数,从右向左结合。
案例:嵌套的控制结构
#include <stdio.h>
int main(void)
{
int c1, c2, c3, grade;
c1 = 1; c2 = c3 = 0;
while (c1 <= 10) {
printf("输入学生的成绩,“1”为及格,“2”为不及格:");
scanf_s("%d", &grade);
c1 = c1 + 1;
if (grade == 1)
c2 = c2 + 1;
else
c3 = c3 + 1;
} //end while
printf("\n统计结束,考试通过学生数:%d,未通过学生数:%d。\n", c2, c3);
if (c2 >= 8)
printf("获得卓越教师奖!\n");
return 0;
}
赋值运算符
赋值运算符 | 样例 | 解释 |
---|---|---|
+= | a += 1 | a = a + 1 |
-= | a -= 1 | a = a -1 |
*= | a *= 1 | a = a * 1 |
/= | a /= 1 | a = a / 1 |
%= | a %= 1 | a = a % 1 |
运算符优先级及结合律(优先级从高到低)
运算符 | 结合律 | 类型 |
---|---|---|
++(后缀) --(后缀) | 从右向左 | 后缀类 |
+ - () ++(前缀) --(后缀) | 从右向左 | 一元类 |
* / % | 从右向左 | 乘法类 |
+ - | 从左向右 | 加减类 |
< <= > >= | 从左向右 | 关系类 |
!= == | 从左向右 | 相等类 |
?: | 从右向左 | 条件类 |
= += -= *= /= %= | 从右向左 | 赋值类 |