一、前面知识点补充
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语言的注释有两种方式:
-
//
-
跨越多行的注释
/* 这是注释 */
所谓注释,并不是每一行都要注释,一般,注释两部分。
- 注释变量是干嘛的,使用范围是怎样的
- 对于程序或者函数,要在最前面写清楚它的功能、参数、返回值等
二、课后作业
-
请问下边代码将打印多少个 ‘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 就可以了。
-
请问下边代码会打印多少个 ‘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,并不符合循环的条件,因此循环一次都没有被执行。
-
请写出表达式 a = b = c = 5 中的"l-value"?
答:a、b、c 都是"l-value"。 -
请问表达式 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。 -
请使用条件运算符求出变量 x 的绝对值,并存放到变量 z 中。
答:z = x < 0 ? –x : x -
假设小甲鱼和黑夜手上均有 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; }
-
这是一个有趣的古典数学问题:如果说兔子在出生两个月后,就有繁殖能力,在拥有繁殖能力之后,这对兔子每个月能生出一对小兔子来。假设所有兔子都不会死去,能够一直干下去,那么两年之后可以繁殖多少对兔子呢?
答:求兔子的问题,其实就是求 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; }