为了开启 C++ 之旅,我们先从变量、函数调用和注释讲起。
注释有两种:单行注释和多行注释。
同一行中 // 后面的所有内容都会被编译器忽略。
多行注释也叫 C 风格注释。
它们由 /* 和 */ 包起来。
夹在两者之间的内容同样会被忽略。
C++ 是一门类型化语言。
所有类型都必须在编译期确定,而且通常需要你显式地写出来。
变量的类型不能改变。
一个名为 years 的整数变量可以这样声明:
int years;
声明变量时顺便初始化是个好习惯。 C++ 提供了多种初始化的写法。 用大括号的写法更符合现代 C++,但用等号的写法也很常见。
int tomatoes{80};
int potatoes = 40;
C++ 确实允许使用未初始化的变量。 在变量被刻意赋值之前,它的值是未定义的,里面可能是任何东西。 为了避免“使用前未赋值”的错误和未定义行为,最好始终初始化。 未定义行为可能在你最不希望的时候让程序崩溃,而它之前一直运行得好好的。 再怎么强调都不为过:无论如何都要避免未定义行为。
像 *、+、- 这样的运算符可以出现在 3 * 2 或 tomatoes + potatoes 这样的表达式里。
只要类型不变,你可以给变量重新赋值:
tomatoes = tomatoes - 5; // tomatoes is now 75
potatoes = (32 * 2) + 11; // potatoes is now 75 as well
函数有名字、返回类型和一个(可能为空的)形参列表。
比如一个名为 always_fortyseven、总是返回 47 的函数长这样:
int always_fortyseven() {
return 47;
}
下面是 vip_fee,它有一个形参:
int vip_fee(int standard_fee) {
/*
vip_fee calculates the vip fee based on the standard_fee.
*/
int vip_multi{3};
return standard_fee * vip_multi;
}
再看 total_fee,这个函数有三个形参,并且调用了另一个函数。
int total_fee(int vips, int adults, int kids) {
/*
total_fee calculates the total price for a group of VIP and adult guests with kids.
Kids get a flat discount on the standard fee.
VIP guest fees are calculated by calling vip_fee.
*/
int standard_fee{30};
int kids_discount{15};
int kids_total_fee = kids * (standard_fee - kids_discount);
int vips_total_fee = vips * vip_fee(standard_fee);
int adult_total_fee = adults * standard_fee;
return vips_total_fee + adult_total_fee + kids_total_fee;
}
C++ 的函数不像某些语言那样会返回最后一条语句的值。
要让代码通过编译,就必须使用 return 关键字。
空白用于给源代码排版,包括空格、制表符和换行符。 由于编译器会忽略多余的空白,你可以用它来组织代码结构。 巧妙地使用空白可以提升代码的可读性。 格式化的标准有很多种,但它们都是约定俗成的,编译器并不会强制执行。
// Formatting makes it easier to find bugs
int eggs_yolks = 3;
int yeast = 15;
int flour=500;int sugar=200;// compact, but difficult to read
Lucian 的女朋友正在回家的路上,而他还没做好他们的周年纪念晚餐!
在这个练习中,你要写一些代码,帮助 Lucian 参照他最爱的食谱做出一道精致的千层面。
你有四个任务,都与做千层面所花的时间有关。
定义ovenTime()函数,它不接受任何实参,返回千层面应该在烤箱里烤多少分钟。
根据食谱,预期的烤箱时间是 40 分钟:
ovenTime();
// => 40
定义remainingOvenTime(int actualMinutesInOven)函数,它以千层面已经在烤箱里烤的分钟数作为实参,并基于上一个任务中预期的烤箱时间(分钟),返回千层面还需要在烤箱里烤多少分钟。
remainingOvenTime(30);
// => 10
定义preparationTime(int numberOfLayers)函数,它以你给千层面加的层数作为实参,返回你准备千层面花了多少分钟,假设每准备一层需要 2 分钟。
preparationTime(2);
// => 4
定义elapsedTime(int numberOfLayers, int actualMinutesInOven)函数,它接受两个实参:第一个实参是你给千层面加的层数,第二个实参是千层面已经在烤箱里烤的分钟数。该函数应返回你做这道千层面已经花了多少分钟,它等于准备时间(分钟)与千层面此刻在烤箱里所花时间(分钟)之和。
elapsedTime(3, 20);
// => 26