文章目录
- 1. C 运算符
- 1.1 算术运算符
- 1.2 关系运算符
- 1.3 逻辑运算符
- 1.4 位运算符
- 1.5 赋值运算符
- 1.6 杂项运算符 ↦ sizeof & 三元
- 1.7 C 中的运算符优先级
- 2. C 判断
- 2.1 if 语句
- 2.2 if...else 语句
- 2.3 if...else if...else 语句
- 2.4 ? : 运算符(三元运算符)
1. C 运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。
C 语言内置了丰富的运算符,并提供了以下类型的运算符:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
1.1 算术运算符
实例
#include <stdio.h>int main()
{int a = 21;int b = 10;int c ;c = a + b;printf("Line 1 - c 的值是 %d\n", c );c = a - b;printf("Line 2 - c 的值是 %d\n", c );c = a * b;printf("Line 3 - c 的值是 %d\n", c );c = a / b;printf("Line 4 - c 的值是 %d\n", c );c = a % b;printf("Line 5 - c 的值是 %d\n", c );c = a++; // 赋值后再加 1 ,c 为 21,a 为 22printf("Line 6 - c 的值是 %d\n", c );c = a--; // 赋值后再减 1 ,c 为 22 ,a 为 21printf("Line 7 - c 的值是 %d\n", c );}
当上面的代码被编译和执行时,它会产生下列结果:
以下实例演示了 a++ 与 ++a 的区别:
实例
#include <stdio.h>int main()
{int c;int a = 10;c = a++; printf("先赋值后运算:\n");printf("Line 1 - c 的值是 %d\n", c );printf("Line 2 - a 的值是 %d\n", a );a = 10;c = a--; printf("Line 3 - c 的值是 %d\n", c );printf("Line 4 - a 的值是 %d\n", a );printf("先运算后赋值:\n");a = 10;c = ++a; printf("Line 5 - c 的值是 %d\n", c );printf("Line 6 - a 的值是 %d\n", a );a = 10;c = --a; printf("Line 7 - c 的值是 %d\n", c );printf("Line 8 - a 的值是 %d\n", a );}
以上程序执行输出结果为:
1.2 关系运算符
#include <stdio.h>int main()
{int a = 21;int b = 10;int c ;if( a == b ){printf("Line 1 - a 等于 b\n" );}else{printf("Line 1 - a 不等于 b\n" );}if ( a < b ){printf("Line 2 - a 小于 b\n" );}else{printf("Line 2 - a 不小于 b\n" );}if ( a > b ){printf("Line 3 - a 大于 b\n" );}else{printf("Line 3 - a 不大于 b\n" );}/* 改变 a 和 b 的值 */a = 5;b = 20;if ( a <= b ){printf("Line 4 - a 小于或等于 b\n" );}if ( b >= a ){printf("Line 5 - b 大于或等于 a\n" );}
}
1.3 逻辑运算符
&& 称为逻辑与运算符。如果两个操作数都非零,则条件为真。
|| 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。
! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。
#include <stdio.h>int main()
{int a = 5;int b = 20;int c ;if ( a && b ){printf("Line 1 - 条件为真\n" );}if ( a || b ){printf("Line 2 - 条件为真\n" );}/* 改变 a 和 b 的值 */a = 0;b = 10;if ( a && b ){printf("Line 3 - 条件为真\n" );}else{printf("Line 3 - 条件为假\n" );}if ( !(a && b) ){printf("Line 4 - 条件为真\n" );}
}
1.4 位运算符
位运算符作用于位,并逐位执行操作。
&、 | 和 ^ 的真值表如下所示:
假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
#include <stdio.h>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 );
}
1.5 赋值运算符
下表列出了 C 语言支持的赋值运算符:
#include <stdio.h>int main()
{int a = 21;int c ;c = a;printf("Line 1 - = 运算符实例,c 的值 = %d\n", c );c += a;printf("Line 2 - += 运算符实例,c 的值 = %d\n", c );c -= a;printf("Line 3 - -= 运算符实例,c 的值 = %d\n", c );c *= a;printf("Line 4 - *= 运算符实例,c 的值 = %d\n", c );c /= a;printf("Line 5 - /= 运算符实例,c 的值 = %d\n", c );c = 200;c %= a;printf("Line 6 - %%= 运算符实例,c 的值 = %d\n", c );c <<= 2;printf("Line 7 - <<= 运算符实例,c 的值 = %d\n", c );c >>= 2;printf("Line 8 - >>= 运算符实例,c 的值 = %d\n", c );c &= 2;printf("Line 9 - &= 运算符实例,c 的值 = %d\n", c );c ^= 2;printf("Line 10 - ^= 运算符实例,c 的值 = %d\n", c );c |= 2;printf("Line 11 - |= 运算符实例,c 的值 = %d\n", c );}
1.6 杂项运算符 ↦ sizeof & 三元
下表列出了 C 语言支持的其他一些重要的运算符,包括 sizeof 和 ? :。
#include <stdio.h>int main()
{int a = 4;short b;double c;int* ptr;/* sizeof 运算符实例 */printf("Line 1 - 变量 a 的大小 = %lu\n", sizeof(a) );printf("Line 2 - 变量 b 的大小 = %lu\n", sizeof(b) );printf("Line 3 - 变量 c 的大小 = %lu\n", sizeof(c) );/* & 和 * 运算符实例 */ptr = &a; /* 'ptr' 现在包含 'a' 的地址 */printf("a 的值是 %d\n", a);printf("*ptr 是 %d\n", *ptr);/* 三元运算符实例 */a = 10;b = (a == 1) ? 20: 30;printf( "b 的值是 %d\n", b );b = (a == 10) ? 20: 30;printf( "b 的值是 %d\n", b );
}
1.7 C 中的运算符优先级
下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。
2. C 判断
判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。
C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。
C 语言提供了以下类型的判断语句:
2.1 if 语句
C 语言中 if 语句的语法:
if(boolean_expression)
{/* 如果布尔表达式为真将执行的语句 */
}
如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false,则 if 语句结束后的第一组代码(闭括号后)将被执行。
C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。
#include <stdio.h>int main ()
{/* 局部变量定义 */int a = 10;/* 使用 if 语句检查布尔条件 */if( a < 20 ){/* 如果条件为真,则输出下面的语句 */printf("a 小于 20\n" );}printf("a 的值是 %d\n", a);return 0;
}
2.2 if…else 语句
C 语言中 if…else 语句的语法:
if(boolean_expression)
{/* 如果布尔表达式为真将执行的语句 */
}
else
{/* 如果布尔表达式为假将执行的语句 */
}
如果布尔表达式为 true,则执行 if 块内的代码。如果布尔表达式为 false,则执行 else 块内的代码。
#include <stdio.h>int main ()
{/* 局部变量定义 */int a = 100;/* 检查布尔条件 */if( a < 20 ){/* 如果条件为真,则输出下面的语句 */printf("a 小于 20\n" );}else{/* 如果条件为假,则输出下面的语句 */printf("a 大于 20\n" );}printf("a 的值是 %d\n", a);return 0;
}
2.3 if…else if…else 语句
一个 if 语句后可跟一个可选的 else if…else 语句,这可用于测试多种条件。
当使用 if…else if…else 语句时,以下几点需要注意:
一个 if 后可跟零个或一个 else,else 必须在所有 else if 之后。
一个 if 后可跟零个或多个 else if,else if 必须在 else 之前。
一旦某个 else if 匹配成功,其他的 else if 或 else 将不会被测试。
C 语言中的 if…else if…else 语句的语法:
if(boolean_expression 1)
{/* 当布尔表达式 1 为真时执行 */
}
else if( boolean_expression 2)
{/* 当布尔表达式 2 为真时执行 */
}
else if( boolean_expression 3)
{/* 当布尔表达式 3 为真时执行 */
}
else
{/* 当上面条件都不为真时执行 */
}
#include <stdio.h>int main ()
{/* 局部变量定义 */int a = 100;/* 检查布尔条件 */if( a == 10 ){/* 如果 if 条件为真,则输出下面的语句 */printf("a 的值是 10\n" );}else if( a == 20 ){/* 如果 else if 条件为真,则输出下面的语句 */printf("a 的值是 20\n" );}else if( a == 30 ){/* 如果 else if 条件为真,则输出下面的语句 */printf("a 的值是 30\n" );}else{/* 如果上面条件都不为真,则输出下面的语句 */printf("没有匹配的值\n" );}printf("a 的准确值是 %d\n", a );return 0;
}
2.4 ? : 运算符(三元运算符)
可以用条件运算符 ? :来替代 if…else 语句。它的一般形式如下:
Exp1 ? Exp2 : Exp3;
其中,Exp1、Exp2 和 Exp3 是表达式。请注意,冒号的使用和位置。
? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个表达式的值。
#include<stdio.h>int main()
{int num;printf("输入一个数字 : ");scanf("%d",&num);(num%2==0)?printf("偶数"):printf("奇数");
}