3.4 运算和运算符
除了指定什么值可以存储在一个变量中之外, 变量类型还决定了我可以对它进行什么操作和它们表示什么。例如:
通过“错误”, 我们认识到编译器拒绝程序对字符串进行减。编译器确切地知道哪种操作可以应用于哪种变量, 这样可以防止很多错误的发生。但是, 编译器不知道哪种操作对你有用, 因此它很高兴接受合法的操作, 即使它们在你看来可能是荒谬的。例如:
很明显, 你的年龄不能是一个负数, 但是没有人会告诉编译器, 因此它会为这个定义生成代码。
下表给出了一些常见的和有用的类型可以使用的操作符:
空白表示一个操作符不能直接用于一种类型(尽管可能有间接使用这种操作符的方式, 见3.7节)。我们将在后面的内容中解释这些操作符。这里的关键是有很多有用的操作符, 它们对相似的类型通常是相同的。
我们来介绍一个涉及浮点数的例子:
很明显, 常见的数学操作有常见的表示法和含义, 这点和我们在小学学到的知识一样。很自然, 并不是我们想对一个浮点数做的任何事(例如得到它的平方根)都有相应的操作符。很多操作都表示为命名函数的形式。在这种情况下, 我们使用标准库中的sqrt()来得到n的平方根: sqrt(n)。这种表示法与数学中相似。我们将会逐渐学习使用函数, 并在4.5节和8.5节中讨论它们的细节。
试一试运行这个小程序。然后, 修改它以读取一个int型, 而不是一个double型。注意, sqrt()不是针对int型定义的, 因此将n赋值给一个double型并执行sqrt()。另外, “练习”一些其他操作。注意, 对于int型来说, /是整除, %是余数(模), 因此5/2等于2(而不是2.5或3), 5%2等于1。对整数*、 /和%的定义, 保证两个正整数a和b可以得到a/b*a+a%b==a。
字符串拥有更少的操作符, 但在第23章中将看到足够多的命名操作。但是, 所支持的操作符都可以按常规方式使用。例如:
字符串+意味着连接, 也就是说, 当s1和s2是字符串时, s1+s2也是字符串, 包含来自s1的字符后接来自s2的多个字符。例如, 如果s1的值为"Hello", s2的值为"World", 那么s1+s2的值为"HelloWorld"。字符串比较操作特别有用:
在这里, 我们使用if语句来根据条件选择动作, 该语句将在4.4.4.1节中详细介绍。