第二、三章

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

运算符优先级及结合律(优先级从高到低)

运算符 结合律 类型
++(后缀) --(后缀) 从右向左 后缀类
+ - () ++(前缀) --(后缀) 从右向左 一元类
* / % 从右向左 乘法类
+ - 从左向右 加减类
< <= > >= 从左向右 关系类
!= == 从左向右 相等类
?: 从右向左 条件类
= += -= *= /= %= 从右向左 赋值类
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容