一个网站多少钱,免费免费网站模板下载,北京广告有限公司,网站平台怎么建设前面已经学习了变量和常量#xff0c;我们可以开始对它们进行操作#xff0c;这就要用到C的操作符。有些语言#xff0c;很多操作符都是一些关键字#xff0c; 比如add, equals等等。C的操作符主要是由符号组成的。这些符号不在字母表中#xff0c;但是在所有键盘上都可以… 前面已经学习了变量和常量我们可以开始对它们进行操作这就要用到C的操作符。有些语言很多操作符都是一些关键字 比如add, equals等等。C的操作符主要是由符号组成的。这些符号不在字母表中但是在所有键盘上都可以找到。这个特点使得C程序更简洁也更国际化。运算符是C语言的基础所以非常重要。 你不需要背下所有这一小节的内容这些细节知识仅供你以后需要时参考 。 赋值Assignation () 赋值运算符的功能是将一个值赋给一个变量。
a 5;将整数5赋给变量a。 运算符左边的部分叫做lvalue (left value)右边的部分叫做rvalue (right value)。lvalue 必须是一个变量而右边的部分可以是一个常量一个变量一个运算(operation)的结果或是前面几项的任意组合。 有必要强调赋值运算符永远是将右边的值赋给左边永远不会反过来。
a b;将变量b (rvalue)的值赋给变量a (lvalue)不论a当时存储的是什么值。同时考虑到我们只是将b的数值赋给a以后如果b的值改变了并不会影响到a的值. 例如如果我们使用以下代码(变量值的变化显示在绿色注释部分): // 赋值符号例子#include iostream
using namespace std;int main ()
{int a, b; // a:?, b:?a 10; // a:10, b:?b 4; // a:10, b:4a b; // a:4, b:4b 7; // a:4, b:7cout a:;cout a;cout b:;cout b;return 0;
}a:4 b:7 以上代码结果是a的值为4 b的值为7。最后一行中b的值被改变并不会影响到a虽然在此之前我们声明了a b; (从右到左规则right-to-left rule)。 C拥有而其他语言没有的一个特性是赋值符 () 可以被用作另一个赋值符的rvalue (或rvalue的一部分) 。例如
a 2 (b 5);等同于
b 5; a 2 b;它的意思是先将5赋给变量b然后把前面对b的赋值运算的结果即5加上2再赋给变量a这样最后a中的值为7。因此下面的表达式在C中也是正确的 a b c 5; //将5同时赋给3个变量a, b和c。 数学运算符Arithmetic operators ( , -, *, /, % ) C语言支持的5种数学运算符为 加addition- 减subtraction* 乘multiplication/ 除division% 取模module 加减乘除运算想必大家都很了解它们和一般的数学运算符没有区别。 唯一你可能不太熟悉的是用百分号(%)表示的取模运算module。取模运算是取两个整数相除的余数。例如如果我们写a 11 % 3;变量a的值将会为结果2因为2是11除以3的余数。 组合运算符Compound assignation operators (, -, *, /, %, , , , ^, |) C以书写简练著称的一大特色就是这些组合运算符compound assignation operators (, -, * 和 / 及其他) 这些运算符使得只用一个基本运算符就可改写变量的值 value increase; 等同于 value value increase; a - 5; 等同于 a a - 5; a / b; 等同于 a a / b; price * units 1; 等同于 price price * (units 1); 其他运算符以此类推。例如 // 组合运算符例子#include iostream
using namespace std;int main ()
{int a, b3;a b;a2; // 相当于 aa2cout a;return 0;
}5 递增和递减Increase and decrease 书写简练的另一个例子是递增increase运算符 ()和递减decrease 运算符(--)。它们使得变量中存储的值加1或减1。它们分别等同于1和-1。因此
a; a1; aa1; 在功能上全部等同即全部使得变量a的值加1。 它的存在是因为最早的C编译器将以上三种表达式的编译成不同的机器代码不同的机器代码运行速度不一样。现在编译器已经基本自动实行代码优化所以以上三种不同的表达方式编译成的机器代码在实际运行上已基本相同。 这个运算符的一个特点是它既可以被用作prefix前缀也可以被用作后缀suffix也就是说它既可以被写在变量标识的前面(a)也可以被写在后面(a)。虽然在简单表达式如a或a中这两种写法代表同样的意思但当递增increase或递减decrease的运算结果被直接用在其它的运算式中时它们就代表非常不同的意思了当递增运算符被用作前缀prefix (a) 时变量a的值线增加然后再计算整个表达式的值因此增加后的值被用在了表达式的计算中当它被用作后缀suffix (a)时变量a的值在表达式计算后才增加因此a在增加前所存储的值被用在了表达式的计算中。注意以下两个例子的不同
例 1例 2B3; AB; // A 的值为 4, B 的值为 4B3; AB; // A 的值为 3, B 的值为 4 在第一个例子中B在它的值被赋给A之前增加1。而在第二个例子中B原来的值3被赋给 A然后B的值才加1变为4。 关系运算符Relational operators ( , !, , , , ) 我们用关系运算符来比较两个表达式。如ANSI-C 标准中指出的关系预算的结果是一个bool值根据运算结果的不同它的值只能是真true或false。 例如我们想通过比较两个表达式来看它们是否相等或一个值是否比另一个的值大。以下为C的关系运算符
相等Equal!不等Different大于Greater than小于Less than大于等于Greater or equal than小于等于Less or equal than 下面你可以看到一些实际的例子
(7 5)将返回false.(5 4)将返回true.(3 ! 2)将返回true.(6 6)将返回true.(5 5)将返回false. 当然除了使用数字常量我们也可以使用任何有效表达式包括变量。假设有a2, b3和c6,
(a 5)将返回false.(a*b c)将返回true 因为它实际是(2*3 6)(b4 a*c)将返回false因为它实际是(34 2*6)((b2) a)将返回true. 注意:运算符 (单个等号)不同于运算符 (双等号)。第一个是赋值运算符(将等号右边的表达式值赋给左边的变量)第二个()是一个判断等于的关系运算符用来判断运算符两边的表达式是否相等。因此在上面例子中最后一个表达式((b2) a)我们首先将数值2赋给变量b然后把它和变量a进行比较。因为变量a中存储的也是数值2所以整个运算的结果为true。 在ANSI-C标准出现之前的许多编译器中就像C语言中关系运算并不返回值为真true或假false的bool值而是返回一个整型数值最为结果它的数值可以为0代表false或一个非0数值(通常为1)来代表true。 逻辑运算符Logic operators ( !, , || ) 运算符 ! 等同于boolean 运算NOT 取非它只有一个操作数(operand)写在它的右边。它做的唯一工作就是取该操作数的反面值也就是说如果操作数值为真true那么运算后值变为假false如果操作数值为假false则运算结果为真true。它就好像是说取与操作数相反的值。例如
!(5 5)返回false因为它右边的表达式(5 5)为真true.!(6 4)返回true因为(6 4)为假false.!true返回假false.!false返回真true. 逻辑运算符和||是用来计算两个表达式而获得一个结果值。它们分别对应逻辑运算中的与运算AND 和或运算OR。它们的运算结果取决于两个操作数operand的关系
第一个操作数 a第二个操作数 b结果 a b结果 a || btruetruetruetruetruefalsefalsetruefalsetruefalsetruefalsefalsefalsefalse 例如
( (5 5) (3 6) ) 返回false ( true false ). ( (5 5) || (3 6)) 返回true ( true || false ).条件运算符Conditional operator ( ? ) 条件运算符计算一个表达式的值并根据表达式的计算结果为真true或假false而返回不同值。它的格式是
condition ? result1 : result2 条件返回值1返回值2如果条件condition 为真true整个表达式将返回esult1否则将返回result2。
75 ? 4 : 3返回3因为7不等于5.752 ? 4 : 3返回4因为7等于52.53 ? a : b返回a因为5大于3.ab ? a : b返回较大值a 或b. // 条件运算符例子#include iostream
using namespace std;int main ()
{int a,b,c;a2;b7;c (ab) ? a : b;cout c;return 0;
}7 上面的例子中a的值为2b的值为7所以表达式(ab)运算值为假(false)所以整个表达式(ab)?a:b要取分号后面的值也就是b的值7。因此最后输出 c 的值为7。 逗号运算符 ( , ) 逗号运算符 (,) 用来分开多个表达式并只取最右边的表达式的值返回。 例如有以下代码
a (b3, b2);这行代码首先将3赋值给变量b然后将
b2赋值给变量
a
。所以最后变量
a的值为5而变量b的值为
3
。位运算符Bitwise Operators ( , |, ^, ~, , ) 位运算符以比特位改写变量存储的数值也就是改写变量值的二进制表示
opasmDescriptionAND逻辑与 Logic AND|OR逻辑或Logic OR^XOR逻辑异或Logical exclusive OR~NOT对1取补位反转Complement to one (bit inversion)SHL左移Shift LeftSHR右移Shift Right 变量类型转换运算符Explicit type casting operators 变量类型转换运算符可以将一种类型的数据转换为另一种类型的数据。在写C中有几种方法可以实现这种操作最常用的一种也是与C兼容的一种是在原转换的表达式前面加用括号()括起的新数据类型
int i; float f 3.14; i (int) f;以上代码将浮点型数字3.14转换成一个整数值(3)。这里类型转换操作符为(int)。在C中实现这一操作的另一种方法是使用构造函数constructor 的形式在要转换的表达式前加变量类型并将表达式括在括号中
i int ( f );以上两种类型转换的方法在C中都是合法的。另外ANSI-C针对面向对象编程object oriented programming增加了新的类型转换操作符 (参考Section 5.4, Advanced class type-casting). sizeof() 这个运算符接受一个输入参数该参数可以是一个变量类型或一个变量自己返回该变量类型(variable type) 或对象(object)所占的字节数
a sizeof (char);这将会返回1给a因为char是一个常为1个字节的变量类型。 sizeof返回的值是一个常数因此它总是在程序执行前就被固定了。 其它运算符 在本教程后面的章节里我们将看到更多的运算符比如指向指针的运算或面向对象编程特有的运算等等我们会在它们各自的章节里进行详细讨论。 运算符的优先度 Precedence of operators 当多个操作数组成复杂的表达式时我们可能会疑惑哪个运算先被计算哪个后被计算。例如以下表达式
a 5 7 % 2我们可以怀疑它实际上表示 a 5 (7 % 2) 结果为6还是 a (5 7) % 2 结果为0? 正确答案为第一个结果为6。每一个运算符有一个固定的优先级不仅对数学运算符我们可能在学习数学的时候已经很了解它们的优先顺序了所有在C中出现的运算符都有优先级。从最从最高级到最低级运算的优先级按下表排列
优先级 Level操作符 Operator说明 Description结合方向 Grouping1::范围从左到右2() [] . - -- dynamic_cast static_cast reinterpret_cast const_cast typeid后缀从左到右3 -- ~ ! sizeof new delete一元(前缀)从右到左* 指针和取地址 -一元符号4(type)类型转换 从右到左5.* -*指向成员的指针从左到右6* / %乘、除、取模从左到右7 -加减从左到右8 位移从左到右9 关系操作符从左到右10 !等于、不等于从左到右11按位与运算从左到右12^按位异或运算从左到右13|按位或运算从左到右14逻辑与运算从左到右15||逻辑或运算从左到右16?:条件运算从右到左17 * / % - ^ |赋值运算从右到左18,逗号从左到右 结合方向Grouping定义了当有同优先级的多个运算符在一起时哪一个必须被首先运算最右边的还是最左边的。 所有这些运算符的优先级顺序可以通过使用括号parenthesis signs (和)来控制而且更易读懂例如以下例子
a 5 7 % 2;根据我们想要实现的计算的不同可以写成
a 5 (7 % 2); 或者 a (5 7) % 2;所以如果你想写一个复杂的表达式而不敢肯定各个运算的执行顺序那么就加上括号。这样还可以使代码更易读懂。