带你学C带你飞 | 前面知识点补充

一、前面知识点补充

1.赋值运算符

  赋值运算符的左边必须是一个lvalue,变量名就是lvalue。如果不在左边就会报错。

error: lvalue required as left operand of assignment

2.复合的赋值运算符

  复合的赋值运算符就是将算术运算符与复制运算符结合到一起。
在这里插入图片描述

3.自增自减运算符

  自增自减运算符只能作用于变量而不能作用于常量或者表达式。
在这里插入图片描述
  自增自减运算符在变量前与后的意义是不一样的。
举个栗子:

#include <stdio.h>

int main()
{       
        int i=5,j;
        
        j = ++i;
        printf("i=%d,j=%d\n",i,j);
        
        i = 5;
        j = i++;
        printf("i=%d,j=%d\n",i,j);
        
        return 0;
} 
[liujie@localhost sle16]$ gcc test.c && ./a.out
i=6,j=6
i=6,j=5

4.逗号运算符

  在C语言中,看到逗号不一定是逗号运算符。有些时候,逗号仅仅是被作为分隔符的作用而已。逗号运算符与for循环语句形影不离。可以通过使用逗号运算符来初始化多个值。当然,也可以将逗号运算符单独拿出来使用,比如:用于对多个变量进行初始化时。

i = 1;
j = 2;
k = 3;
//两者之间等价
i = 1,j = 2, k = 3;

  逗号表达式的语法格式为

表达式1,表达式2,...,表达式n
  • 逗号表达式的运算过程为从左往右逐个计算表达式
  • 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。

在这里插入图片描述

5.条件运算符

  C语言中有一个唯一的三目运算符就是条件运算符,作用是提供一种简写的方式来表示if...else语句。其语法格式为

exp1?exp2:exp3;
  • exp1是条件表达式
  • 如果结果为真,返回exp2
  • 如果结果为假,返回exp3

如下图,两者之间是等价的。
在这里插入图片描述

6.goto语句

  goto语句是一个历史遗留产物,有汇编语言的痕迹。goto语句的作用就是直接跳转到指定的标签位置。语法格式为

goto 标签;

在开发中,要尽量避免使用goto语句。频繁使用goto语句,容易破坏代码原有的逻辑。不过,当你要面临很多层循环时,要从最里层的循环跳到最外边,就需要使用goto语句一步到位,因为使用break语句需要逐层往外跳。

7.注释

  C语言的注释有两种方式:

  • //

  • 跨越多行的注释

    /*
    这是注释
    */
    

  所谓注释,并不是每一行都要注释,一般,注释两部分。

  • 注释变量是干嘛的,使用范围是怎样的
  • 对于程序或者函数,要在最前面写清楚它的功能、参数、返回值等

二、课后作业

  1. 请问下边代码将打印多少个 ‘A’?

    #include <stdio.h>
    
    int main()
    {
            int i, j;
    
            for (i = 0; i != 10, j != 10; i++)
            {
                    for (j = 0; j < 10; j++)
                    {
                            putchar('A');
                    }
            }
    
            putchar('\n');
    
            return 0;
    }
    

    答:10个。这道题的陷阱在于让你认为退出外层循环需要同时符合 i == 10 和 j == 10 两个条件。其实并不是这样,这是一个逗号表达式,只取最后边的值。也就是说只要满足 j == 10 就可以了。

  2. 请问下边代码会打印多少个 ‘B’?

    #include <stdio.h>
    
    int main()
    {
            int i = 0;
    
            while (i++)
            {
                    if (i > 10)
                    {
                            goto Label;
                    }
                    putchar('B');
            }
    
    Label:  putchar('\n');
    
            return 0;
    }
    

    答:一个都没有!因为i++是先取出变量i的值,再为变量自身加一。因此第一进入循环判断时,取出的值是0,并不符合循环的条件,因此循环一次都没有被执行。

  3. 请写出表达式 a = b = c = 5 中的"l-value"?
    答:a、b、c 都是"l-value"。

  4. 请问表达式 a = (b = 3, 4, c = b++ + 5, ++c + ++b); 执行后,整型变量 a、b、c 的值是?
    答:a = 14, b = 5, c = 9
    解析:解答这道题需要充分消化这一节课我们所学习的内容,首先 b = 3(因为赋值运算符的优先级比逗号运算符高);c = b++ + 5,c = 8(因为 b++ 是先使用变量 b 的值,再将自身加一);a 最后的值是 ++c + ++b,此时 c = 8,b = 4,则 a = 9 + 5,最后 a = 14, b = 5, c = 9。

  5. 请使用条件运算符求出变量 x 的绝对值,并存放到变量 z 中。
    答:z = x < 0 ? –x : x

  6. 假设小甲鱼和黑夜手上均有 10000 元,小甲鱼以 10% 的单利息投资,黑夜则以每年 5% 的复合利息投资。请编写一个程序,计算需要多少年黑夜手头的 Money 才会超过小甲鱼?
    提示:单利息即每年的利息均为投资额 * 利率;复合利息则是每年的本息所得作为第二年的投资额。

    #include <stdio.h>
    
    #define MONEY   10000
    
    int main()
    {
            double a_total = MONEY, b_total = MONEY;
            int count = 0;
    
            do
            {
                    a_total += MONEY * 0.1;
                    b_total += b_total * 0.05;
                    count++;
            } while(a_total >= b_total);
    
            printf("%d年后,黑夜的投资额超过小甲鱼!\n", count);
            printf("小甲鱼的投资额是:%.2f\n", a_total);
            printf("黑夜的投资额是:%.2f\n", b_total);
    
            return 0;
    }
    
  7. 这是一个有趣的古典数学问题:如果说兔子在出生两个月后,就有繁殖能力,在拥有繁殖能力之后,这对兔子每个月能生出一对小兔子来。假设所有兔子都不会死去,能够一直干下去,那么两年之后可以繁殖多少对兔子呢?
    答:求兔子的问题,其实就是求 Fibonacci 数列,Fibonacci 数列用数学函数来定义如下:
    在这里插入图片描述

    #include <stdio.h>
    
    int main()
    {
            long a = 1, b = 1, c, i;
            for (i = 3; i <= 24; i++)
            {
                    c = a + b;
                    a = b;
                    b = c;
            }
    
            printf("两年后,总共有%ld只兔子!\n", c);
    
            return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值