目录
算术运算符
逻辑运算符
位运算符
杂项运算符 ↦ sizeof & 三元
取整取余(取模)
取整
取余(取模)
a++ 与 ++a 区别在于一个后加,一个先加。
运算符优先级:
"~"运算符
C 作用域规则
C语言语句
switch 语句嵌套
循环控制语句
continue 语句
下表显示了 C 语言支持的所有算术运算符。
假设变量 A 的值为 10,变量 B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | A + B 将得到 30 |
- | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
* | 把两个操作数相乘 | A * B 将得到 200 |
/ | 分子除以分母 | B / A 将得到 2 |
% | 取模运算符,整除后的余数 | B % A 将得到 0 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 11 |
-- | 自减运算符,整数值减少 1 | A-- 将得到 9 |
下表显示了 C 语言支持的所有关系逻辑运算符。假设变量 A 的值为 1,变量 B 的值为 0,则:
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 |
位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示:
p | q | p & q ( 与) | p | q ( 或) | p ^ q ( 异或) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
实例
#include
int main()
{
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
printf("Line 1 - c 的值是 %d\n", c );
c = a | b; /* 61 = 0011 1101 */
printf("Line 2 - c 的值是 %d\n", c );
c = a ^ b; /* 49 = 0011 0001 */
printf("Line 3 - c 的值是 %d\n", c );
c = ~a; /*-61 = 1100 0011 */
printf("Line 4 - c 的值是 %d\n", c );
c = a << 2; /* 240 = 1111 0000 */
printf("Line 5 - c 的值是 %d\n", c );
c = a >> 2; /* 15 = 0000 1111 */
printf("Line 6 - c 的值是 %d\n", c );
}
结果
Line 1 - c 的值是 12
Line 2 - c 的值是 61
Line 3 - c 的值是 49
Line 4 - c 的值是 -61
Line 5 - c 的值是 240
Line 6 - c 的值是 15
<<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
---|---|---|
>>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? :。
运算符 | 描述 | 实例 |
---|---|---|
sizeof() | 返回变量的大小。 | sizeof(a) 将返回 4,其中 a 是整数。 |
& | 返回变量的地址。 | &a; 将给出变量的实际地址。 |
* | 指向一个变量。 | *a; 将指向一个变量。 |
? : | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y |
语法:a / b (a 取整 b)
作用: 使用整数除法运算把小数部分除去。
例: 1 / 4 = 0; 2 / 4 = 0; 3 / 4 = 0; 4 / 4 = 1; 5 / 3 = 1; 4 / 2 = 2;
符号与被除数相同:
语法:a % b(a 取余 b)
作用:获取余数
例:1 % 4 = 1; 2 %4 = 2; 3 % 4 = 3; 4 % 4 = 0; 6 % 5 = 1;7 % 5 = 2;
对取余运算的说明 C 语言中的取余运算只能针对整数,也就是说,% 的两边都必须是整数,不能出现小数,否则编译器会报错。
另外,余数可以是正数也可以是负数,由 % 左边的整数决定:
如果 % 左边是正数,那么余数也是正数;
如果 % 左边是负数,那么余数也是负数;
例子:
#include
int main()
{
printf( "100%%12=%d \n
100%%-12=%d \n
-100%%12=%d \n
-100%%-12=%d \n",
100%12, 100%-12, -100%12, -100%-12 );
return 0;
}
运行结果:
100%12=4
100%-12=4
-100%12=-4
-100%-12=-4
不同长度的数据进行位运算
如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。
以“与”运算为例说明如下:在 C 语言中 long 型占 4 个字节,int 型占 2 个字节,如果一个 long 型数据与一个 int 型数据进行“与”运算,右端对齐后,左边不足的位依下面三种情况补足:
(1)如果整型数据为正数,左边补 16 个 0。
(2)如果整型数据为负数,左边补 16 个 1。
(3)如果整形数据为无符号数,左边也补 16 个 0。
如:long a=123;int b=1; 计算 a & b。
如:long a=123;int b=-1; 计算 a & b。
如:long a=123; unsigned int b=1; 计算 a & b。
a++ 输出 a 的值再自加,缓存 a 自加后的结果,用于下次进行与 a 相关的计算。
++a 则相当于 a+1。
#include
int main(int argc, char **argv)
{
int a=100;
int b=50;
// b++;
printf("%d,%d\n",a++,++a);
printf("%d,%d",b++,++b);
return 0;
}
运行后输出:
101,102
51,52
若不注释 b++:
int main(int argc, char **argv)
{
int a=100;
int b=50;
b++;
printf("%d,%d\n",a++,++a);
printf("%d,%d",b++,++b);
return 0;
}
则结果为:
101,102
52,53
单 算 关 逻 条 赋 逗
括号成员是老大; // 括号运算符 []() 成员运算符. ->
全体单目排老二; // 所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&
乘除余三,加减四; // 这个"余"是指取余运算即%
移位五,关系六; // 移位运算符:<< >> ,关系:> < >= <= 等
等与不等排行七; // 即 == 和 !=
位与异或和位或; // 这几个都是位运算: 位与(&)异或(^)位或(|)
"三分天下"八九十;
逻辑与,逻辑或; // 逻辑运算符: || 和 &&
十一十二紧挨着; // 注意顺序: 优先级(||) 底于 优先级(&&)
条件只比赋值高, // 三目运算符优先级排到 13 位只比赋值运算符和 "," 高
逗号运算最低级! // 逗号运算符优先级最低
二进制求补运算符(二进制反码运算符、按位反码):对在内存中存储的是补码按位取反(包括符号位)。此时,得到的结果仍为补码,需要进一步转换为原码,得到最终输出信息。
正数的原码、反码、补码是一样的。
对于负数3种码不同:
原码:第一位表示符号位,其余位表示数值。反码:符号位不变,其余按位取反。
补码:反码加1称为补码。补码=反码+1,反码=补码-1。
在计算机中,负数以其正值的补码形式表达
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。 比如 00000000 00000000 00000000 00000101 是 5 的原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。 比如:将 00000000 00000000 00000000 00000101 每一位取反,得 11111111 11111111 11111111 11111010。
补码:反码加1称为补码。 也就是说,要得到一个数的补码,先得到反码,然后将反码加上 1,所得数称为补码。 比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么5的补码为: 补码加一 11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。
任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:
在函数或块内部的局部变量
在所有函数外部的全局变量
在形式参数的函数参数定义中
全局变量与局部变量在内存中的区别:
全局变量保存在内存的全局存储区中,占用静态的存储单元;
局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。
#include
int main(void)
{
char sex;
int age ;
printf("请输入你的性别简称!男(M),女(F)\n");
scanf_s("%c", &sex);
switch (sex)
{
case 'M':
case 'm':
printf("你的性别为“男”请你进入测试!\n");
printf("请输入你的工龄!\n");
scanf_s("%2d",&age);
switch (age)
{
case 5:
printf("奖励iphone一台!!\n");
break;
case 10:
printf("奖励汽车一辆!!\n");
break;
case 15:
printf("奖励小楼一栋!!\n");
break;
default:
printf("抱歉,未满足奖励条件或者超出工龄!!\n");
break;
}
break;
case 'F':
case 'f':
printf("你的性别为“女”请你进入测试!\n");
printf("请出入你的工龄!\n");
scanf_s("%2d",&age);
switch (age)
{
case 5:
printf("奖励iphone一台!\n");
break;
case 10:
printf("奖励名牌化妆品一套!\n");
break;
case 15:
printf("奖励爱马仕包一个!\n");
break;
default:
printf("抱歉, 未满足奖励条件或者超出工龄!!\n");
break;
}
break;
}
return 0;
}
循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。
C 提供了下列的循环控制语句。点击链接查看每个语句的细节。
控制语句 | 描述 |
---|---|
break 语句 | 终止循环或 switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。 |
continue 语句 | 告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。 |
goto 语句 | 将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。 |
C 语言中的 continue 语句有点像 break 语句。但它不是强制终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。
对于 for 循环,continue 语句执行后自增语句仍然会执行。对于 while 和 do...while 循环,continue 语句重新执行条件判断语句。
#include
int main ()
{
/* 局部变量定义 */
int a = 10;
/* do 循环执行 */
do
{
if( a == 15)
{
/* 跳过迭代 */
a = a + 1; // a等于16
continue; // 跳过此次循环(不执行下面程序) 重新执行while判断
}
printf("a 的值: %d\n", a);
a++;
}while( a < 20 );
return 0;
}
结果
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19