C语言完全听懂系列 - day4

  • 我们之前假设了狗的岁数,现在我们让这个程序更实用一点,读取一个用户输入,计算岁数,然后输出。
#include <stdio.h>
int main() {
    int dog_age;
    scanf("%d", &dog_age);
    int human_age = dog_age * 7;
    printf("%d", human_age);
}
  • 我们依然需要一个变量存储狗的岁数,只不过这次没有指定默认值,只是申请了一块空间,里面暂时没有数据。

  • 我们用scanf读取用户输入,scan是扫描的意思,f是format,指这个函数会按照指定的格式理解数据,"%d"之前在printf那边的语义是按照十进制输出一个数字,那在这边的语义就是,将你的输入理解为一个十进制的数字,&可以理解为“存储到”,将读取的用户输入存储到dog_age里面。

  • 运行一下,现在他会一直等待你的输入,直到你输入完成并按下回车

  • image

  • 你也可以尝试加一个提示,这样看起来友好一点

printf("Input the age of dog:\n"); //将这个用户提示加在合适的位置
  • //开头的称之为注释,写在代码里的时候,//后面的,这一行的所有文本,编译器都会直接忽略,用于写一些给程序员自己看的笔记,提示之类的。
  • 现在我们变更一下假设:
    • 狗的前两年中,每一年相当于人类的 10.5 岁
    • 狗的第三年起,每年相当于人类的 4 岁
  • 我们修改一下岁数计算的逻辑:
#include <stdio.h>
int main() {
    int dog_age;
    printf("Input the age of dog:\n");
    scanf("%d", &dog_age);
    float human_age;
    if (dog_age <= 2) {
        human_age = dog_age * 10.5;
    } else {
        human_age = 2 * 10.5 + (dog_age - 2) * 4;
    }
    printf("%f", human_age);
}
  • 我们先从自然语言的角度理解一下7~9行,显然这两块的代码是“二选一”的,只有一块会被执行,if后面可以跟一块代码,用一对大括号括起来的这一整块都属于这个if,if后面的“条件”满足时,执行这一块代码。
  • if的条件要用小括号括起来,这个单纯是C语言那个年代的技术力限制,编译器需要这对括号,来区分哪些字符是条件,现代编程语言就不需要这对括号,写起来也更自然一点。
  • if和else后面,永远要跟一对大括号,把属于if或者属于else的代码括起来。
  • 还可以这样写:
if () {
    
} else if () {
    
} else {
    
}
  • 这个else if块可以无限续杯,想加多少加多少,代码会自上而下顺序匹配,找到条件满足的一块执行。所有条件都不匹配时,走else。
//你也可以这样写,大括号另起一行。
//在编程里,任何的空格、回车、Tab都是可以随意加的,编译器不在乎,大括号放在哪也纯看个人风格
//要不要另起一行都是吵了四十多年两三代人的老话题了,
if () 
{
    
} else if () 
{
    
} else 
{
    
}
  • 第10行,dog age - 2被小括号括起来了,和数学上是完全一样的,减法运算优先级低,想先算减法就要用括号括起来。

  • 所有的符号前后分别加了一个空格,是一个编程习惯,看起来会更清晰一点,加不加空格不影响代码的意思,一般老登都会养成这个习惯。也有一些现代工具,也可以在你写完代码之后,保存的时候,一键加空格,更省心一点。

  • 第6行引入了一个新的关键字,float。我们之前说数据分为数字和文本两大类,而数字本身又分为整数和小数两大类,比如3和3.14。整数和小数在计算机底层的存储结构完全不一样,小数采用了一种特殊的存储结构,让他可以表示的数字范围更大,我们之前说4字节的int,最大表示的数字大约42亿,换算一下大概是 4.2 × 10⁹ ,4字节的小数用同样的空间大小可以保存3.4 * 1038 大小的数字,可以看到区别还是非常大的。我们之前说的int,准确来讲是定义一个4字节的整数,而float,是定义4字节的小数。我们每次在想存一个数字的时候,要先搞清我需要的到底是整数还是小数,int存不了一个小数的值,不过反过来可以,float能存整数,毕竟3就是3.000。

  • int是integer,整数的缩写,float就是浮点数,浮点数就是小数的意思,因为任何一个小数的小数点都可以挪位置,比如3.14,也可以写成3.14 * 100, 或者0.314 * 101, 或者31.4 * 10-1 ,所以叫浮点数。

    • 扩展:对于一个小数来讲,其实就是由三部分组成,有效数字(314),底数(10),指数(1, 0,-1),这三部分确定了,一个小数的值也就确定了,所以小数在底层的存储结构,其实就是把有效数字和指数都转成二进制存起来了 ,底数固定为2了不需要存。整数的存储机制,简单理解为把十进制的数字转成二进制,就是他实际的存储格式,存储原理很不一样对吧。
  • 小数能表示的数字范围大了这么多,是有代价的,代价就是一个小数里只有7位有效数字,比如说3.141592,或者314.1592,2再后面的数字都是不准确的,牺牲的就是准确性,后面倒也不是随机数,整个小数还是会无限接近准确的数字的,只是没办法严格相等。

  • image

  • 12行printf里的格式占位符变了,打印小数要用%f,printf会按照“他是一个小数”的假设来理解human_age这个数据。

  • C语言那本书的P24-P25可以看看

  • 其他可以用在if条件里面的运算符,注意判断相等要用==,因为一个=是变量赋值的意思。
    image

  • 练习:
    image

  • 提示:中文可能会乱码,不要在文本里写中文,都换成拼音(或英文)吧,之后单开一章讲怎么才能不乱码。

posted @ 2025-04-16 21:09  merlbc  阅读(2)  评论(0)    收藏  举报