继续上一篇文章所讲,接下来将对剩余的操作符进行详细分析。
目录
六、单目操作符
1.逻辑反操作符
!,是进行逻辑反操作,即是对一个表达式取其相反的结果。例如:
int main()
{
int a = 0;
if (!a)
{
printf("hehe\n");
}
return 0;
}
例如上述代码中,使用一个被赋值为 0 的变量 a 作为判断条件,正常情况下,if 语句后的内容并不会执行,但是由于 a 的前面加上了 !,则将本来为假的结果变成了真( 0 表示假),所以 if 语句后的内容执行,打印了 hehe 。
2. “ - ”、“ + ”
这两个符号也是日常中十分常见的,但是在C语言和日常生活使用中有着一定差别。其中负号仍旧是把一个值变成负数,但是正号却并不能将一个值变成正数,所以该符号几乎没有作用。
例如上面的代码,“ - ”使得打印出来的第一个数变成了负数,但是“ + ”却并没有使得第二个数变成正数。
3. “ & ”、“ * ”
这两个操作符经常是在同一场景下使用,所以放在一起说明。
“ & ”是取出某个变量的地址,“ * ”是对指针进行解引用操作,使用指针所指向的变量。
所以我们经常性会使用“ & ”取出某个变量的地址存放于一个指针变量中,然后再通过“ * ”进行解引用操作,操作指针指向的变量。
正如上面的代码中所示,str 中存放着 a 的地址,所以 *str 相当于直接使用变量 a ,所以二者打印出来的内容是一样的。
4. sizeof()
sizeof()可以求出括号内容所占多少个字节。sizeof 既是一个操作符,同时也是C语言中的关键字。我们经常可以使用此操作符求解出数组个数。代码如下:
sizeof(arr)是求出了整个数组的内存大小,sizeof(arr[0])是求出了数组中第一个元素的内存大小。已知整型数组内,每个元素都是四个字节,而整个数组的内存大小是数组内所有元素的内存总和,所以使用总和除以单个的内存大小就求出了数组元素的个数。
需要注意的是,sizeof()括号内如果是表达式时,表达式并不会进行计算。
可以看到图中的代码中,虽然求出了 sz 的值,但是 a 的值并没有因为 sizeof()括号内的表达书而被赋值为 20。这是因为 sizeof()整个表达式的值是在程序进行“ 编译 ”时就计算出来的,而 a = 20 此类表达式需要程序将源文件转化为可执行文件后,到达“ 运行 ”的步骤时才会进行的,所以当程序想要运行括号内的该类表达式时,sizeof()的值早已计算完成,所以内部的表达式自然也消失了,无法再进行计算了。
5. “ ~ ”
“ ~ ”是对一个数的二进制位补码进行按位取反,与求出负整数反码的操作的不同之处在于,“ ~ ”需要对包括符号位在内的所有位进行操作。同时需要注意的是,该操作符一样只能对整数进行操作。
6.“ ++ ”、“ - - ”
这两个符号叫做自增操作符和自减操作符,顾名思义是对操作数本身进行自增或者自减操作,每次都是自增 1 或者自减 1 。但是他们的使用方式有两种:一种是将其放置于操作数之前,名为前置自增或前置自减;另一种是将其放置于操作数之后,为后置自增或后置自减。这两种操作的不同之处在于,前置是先对操作数进行后续相应的操作再进行 +1 或者 -1,而后置则与其相反。
如上图所示,a++ 先对 a 进行了打印操作,然后再让 a 自增 1,所以后一次打印就从0变成了1。
而++a则与a++相反,先对 a 进行了自增 1 的操作,然后再打印,所以前后打印出来的结果相同。
自减操作符与自增操作符使用方法相同,所以不做重复演示。
七、关系操作符
关系操作符包括:>、<、>=、<=、!=、==
前四个操作符我们已经是不陌生了,使用方法也是没有太大区别。
!= ,意思是不等,与后面的 == 是对应关系。
需要注意的地方是,要注意区分 = 和 ==,前者是赋值操作符,后者是判断前后表达式或者操作数是否相等,在判断条件书写时不能粗心混淆。
八、逻辑操作符
逻辑操作符包含:&&、||。要注意区分逻辑操作符和按位与、按位或。
&&,叫做逻辑与,只有当左右两个表达式同时为真时,整个逻辑表达式才为真,其中任意一个为假则为假。
||,叫做逻辑或,只有当左右两个表达式同时为假时,整个逻辑表达式才为假,其中任意一个为真则为真。
这两个操作符还有“ 短路 ”的作用。例如 && :当前一个表达式为假时,即已经可以判定整个逻辑表达式为假了,所以后一个表达式程序就会判定无需进行计算,所以后一个不再计算。
|| 也同理,当前一个表达式为真时,后一个表达式也不再计算。下面我们用代码验证一下。
如上图所示,当是 && 的情况下,如果左端的表达式为 0,整个逻辑表达式已经为假了,所以 ++b 不再执行,前后两次打印 b 是相同的值。
但当左端的值为1时,右端表达式仍旧执行,此时++b就会执行,前后两次打印 b 的值就不同了。
|| 的原理也与此相似,在此不做重复演示了。
九、条件操作符
条件操作符是一个三目操作符,他的使用格式是这样的:表达式1 ?表达式2 :表达式3
这个表达式的意思是:如果表达式1成立,那么就执行表达式2,否则执行表达式3.
可以看到上下两次打印的结果相同,所以条件操作符的作用其实就等同于下面的判断结构。
但是条件操作符只能用于简单的执行内容,例如判断最大值或者最小值,过于复杂的执行内容不适用于条件操作符。
十、逗号表达式
逗号表达式就是用逗号隔开的多个表达式组成的。逗号表达式是从左往右依次执行的,但是整个表达式的结果由最后一个表达式确定。
逗号表达式的结构:表达式1, 表达式2, 表达式3, 表达式4, ……表达式n。
如上图所示,无论逗号表达式里面的表达式多花里胡哨,b 只“ 钟情 ”于最后一个表达式,所以它的值只由最后一个表达式确定,但是此处里面的多个表达式也都是会执行的,不会像 sizeof()中一样直接无效,所以最后 a 的值也因为逗号表达式其中的表达式被赋值为 10。
使用逗号表达式,可以将需要执行的多个表达式写在一起,可以减少代码量,看起来也更加简洁。
十一、 “[ ]”、“( )”、“ . ”、“ ->”
1.下标引用操作符
“[ ]”,该操作符的操作数为:方括号外一个数组名,括号内一个索引值。
上图中,arr 和 括号内的 0 便是下标引用操作符的两个操作数。
2.函数调用操作符
“( )”,该操作符的操作数的个数根据不同场景可以不同,没有固定个数。
其中位于括号外的操作数为第一个操作数,为函数名,剩余的操作数位于括号内,都为该函数的实际参数,是传递给该函数的参数。
如上图所示:函数调用操作符前为第一个操作数,即 Add 为函数名。括号内的 a,b 都为传递给函数的参数。
3.访问一个结构的成员
当想要访问结构体中的成员变量时,可以借助两种操作符:“ . ” 或者 “->”。
使用方法:当使用的是一个结构体变量时,需要借助的是“ . ”,格式为:结构体 . 成员名 当使用的是一个结构体指针时,需要使用的是“ -> ”,格式为:结构体指针 -> 成员名
可以看到上图中两次打印的内容是相同,这就说明上述说到的两种操作符的效果是一样的。
以上就是C语言中所有常用的操作符解析了,希望文章的内容有助于各位对于操作符的理解。如果上述内容有错误之处,劳烦各位指出,确认之后我一定进行改正。