当我们有1之后就会产生2,继而产生之后的一些数字,由此产生了加减乘除的运算,c语言中的运算也包括这些,而且还产生了一些运算的变体。
1.算数运算
1)+、-、*
2)/、%
整数相除,取整数部分。11%5=商2,余1
/和%不能对整数0进行操作,否则会中断程序。但是可以对浮点0进行操作,但是得到的结果是inf,表示无穷大。
%不能对浮点数使用。
/向零取整(取更接近0的数字)。
%的结果与其左操作数的符号一致。
2.赋值运算
1)将赋值运算符右边的值付给左边的变量。// =
int a;
a = 5; // 将5赋给a
2)赋值表达式的值就是赋值表达式左操作数的值。
int a, b, c;
a = b = c = 5; // a = (b = (c = 5));
printf ("%d,%d,%d\n", a, b, c); // 5,5,5
3)赋值运算符的左操作数必须是一个左值——可被赋值的对象——变量,常量或表达式不能被赋值。
100 = 200; // error
100 = a; // error
a + b = c; // error
4)赋值运算符是“=”而不是“==”。
5)赋值运算符还可和其它运算符结合起来使用,构成复合赋值。
a += b; // a = a + b
a %= b; // a = a % b
6)初始化与赋值是不同的。
int a = 10; // 初始化 //int a;
a = 100; // 赋值
3.自增减运算
1)++/--:变量自增/减1。
int a = 10;
a++; // a:11
a--; // a:10
++a; // a:11
--a; // a:10
2)不能用于常量。
10++; // error
--10; // error
3)可以用于所有的整型类变量,以及浮点类,但是多数情况下用于int。
4)前后缀自增减的区别:
前缀:先自增减,在计算表达式。++a
后缀:先计算表达式,再自增减。a++
a++表达式和++a表达式的值都是从操作数a的内存空间中得到的。二者的区别在于,一个是先取表达式的值再自增,另一个是先自增在取表达式的值。
5)忠告:自增减运算最好不要在一个表达式中使用多次。
1.关系运算
>/>=/</<=/==/!=
关系运算表达式的值是整数:1或者0。
逻辑真:1
2.逻辑运算
1)逻辑与(&&)、逻辑或(||)、逻辑非(!)
A && B:只有当A和B的值都为真(非零)时,表达式的值才为真。
A || B:只有当A和B的值都为假(零)时,表达式的值才为假。
! A:当A的值为真时,表达式的值为假,当A为假时,表达式的值为真。
2)短路运算
A && B:如果A的值为假,则B不处理。
A || B:如果A的值为真,则B不处理。
3.位运算
1)位与(&)/位或(|)/位异或(^)/位反(~)
位与:参与运算的两位都是1结果为1,否则为0。位与可以置某一位为0,也可以得到某一位的值。
10110001 A
11101111 B
&)-----------
10100001 C
^
10110001 A
00010000 B
&)----------- 若A&B==B,则A中此位为1
00010000 C
^
位或:参与运算的两位都是0结果为0,否则为1。位或可以置某一位为1,也可以得到某一位的值。
10100001 A
00010000 B
|)------------
10110001 C
^
10100001 A
11101111 B
|)------------ 若A|B==B,则A中此位为0
11101111
^
异或:参与运算的两位相异为1,相同为0。异或可以翻转某一位,想翻哪位哪位就是1,其余为0。
10101010 A
00100100 B
^)------------
10001110 C
^ ^
A^B->C
C^B->A
C^A->B
异或还可用于在不增加第三变量的前提下,交换两个变量的值。
int a = 100, b = 200;
int c = a;
a = b;
b = c;
--------------------
a : 1011 11
b : 0110 6
a = a ^ b; // a : 1101 13
b = a ^ b; // b : 1011 11
a = a ^ b; // a : 0110 6
位反:按位取反
01100001
~)-----------
10011110
2)左右移位
A.有符号数:左移补零,右移补符
10101010 << 1 -> 01010100
-86 -172
10101010 >> 1 -> 11010101
-86 -43
B.无符号数:左移右移全补零
10101010 << 1 -> 01010100
170 84
10101010 >> 1 -> 01010101
170 85
在不发生溢出的情况下,左移一位即乘2,右移一位即除2。
00000010 << 1 -> 00000100
2 4
int main()
{
int sec;
int h,m,s;
printf("请您输入一个秒数:");
scanf("%d",&sec);
if(sec<=0)
{
printf("时间不存在零或负数!");
return 0;
}
h=sec/3600;
m=sec%3600/60;
s=sec%60;
printf("%2dh:%2dm:%2ds:\n",h,m,s);
return 0;
}