1、条件操作符
exp1 ? exp2 :exp3
含义:exp1是否为真,为真exp2为整个表达式结果,为假exp3为整个表达式结果。
我们看一段代码:
#include <stdio.h> int main() { int a = 3; int b = 0; if (a > 5) printf("%d\n", a); else printf("%d\n", b); return 0; }
效果展示:
我们将这段代码改为条件表达式语句:
上面的 if - else 语句的意思是:如果 a > 5,打印 a,否则打印 b。
我们根据这句话来改:
#include <stdio.h> int main() { int a = 3; int b = 0; int c = (a > 5) ? a : b; printf("%d\n", c); return 0; }
效果展示:
2、逗号表达式
exp1,exp2,exp3,…expN
逗号表达式就是用逗号隔开的多个表达式。
逗号表达式从左到右依次执行。整个表达式的结果是最后一个表达式的结果。
Q:看一段代码,给出答案
#include <stdio.h> int main() { int a = 1; int b = 2; int c = (a > b, a = b + 10, a, b = a + 1); printf("%d\n", c); return 0; }
我们来分析一下:
按照逗号表达式的执行流程来分析,c 先执行 a > b, 不管是否大于它都会往后走,经过 a = b + 10,得出 a = 12,再经过 a,a 还是 12,在经过 b = a + 1,得出 b = 13,执行完后赋给 c,这时 c = 13。
我们看展示效果:
这就验证了:逗号表达式从左到右依次执行。整个表达式的结果是最后一个表达式的结果。
再来看一段代码:
if (a = b + 1, c = a / 2, d > 0)
这个 if 语句的判断内容是逗号表达式,真正的判断语句是最后一个表达式,只有d > 0 时才进入 if 语句,但是还是从左到右依次执行,因为有可能前面的式子影响最后一个式子。
逗号表达式的灵活使用:
我们看一段代码,并且对它进行改写
#include <stdio.h> int main() { int a = 3 + 5; int a = a + 1; while (a > 0) { //业务处理 ; } return 0; }
分析:
这段代码从进入main函数开始就在对 a 进行操作,a 的值一直在改变,并且在经过两次处理后作为 while 循环的条件判断句。那我们是不是就可以使用逗号表达式对它进行改写:
#include <stdio.h> int main() { int a = 0; while ((a=3+5), (a=a+1), a > 0) { //业务处理 } return 0; }
3、下标引用操作符
[ ] -- 下标引用操作符
操作数:数组名 + 一个索引值
我们以代码来深入了解
#include <stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,0 }; // 这里[ ]不是下标引用操作符,这是语法规定。 printf("%d\n", arr[2]); // 这个[ ]就是下标引用操作符。arr与2是操作数。 return 0; }
分析:
我们这里要打印3,就找arr[2],将它打印出来。这里的 [ ] 就是下表引用操作符,arr 与 2 就是操作数。而初始化的 [ ] 不是下标引用操作符,是语法规定。
4、函数调用操作符
( )-- 函数调用操作符
接受一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
我们还是以代码来深入了解
#include <stdio.h> #include <string.h> int main() { int len = strlen("abc"); // 这里()就是函数调用操作符,里面的形参"abc"就是操作数 printf("%d\n", len); return 0; }
分析:
我们这里调用了库函数 strlen ,strlen后面的( )就是函数调用操作符,里面的形参 "abc" 以及函数名 strlen 都是操作数。自定义函数在调用的时候也是这样的。
5、结构成员
访问一个结构体成员(有两种形式)
. 结构体变量 . 成员名
-> 结构体指针 -> 成员名
我们以代码深入了解
#include <stdio.h> struct S { int num; char ch; }; int main() { struct S s = { 100, 'L' };//结构体初始化时用{}。 //找结构体中的成员 printf("%d\n", s.num); printf("%c\n", s.ch); return 0; }
效果展示:
这里我们使用 . 来访问。
如果我们是以指针形式访问的话就得使用 -> 来访问。
如下:
#include <stdio.h> struct S { int num; char ch; }; void test(struct S* ps) { printf("%d\n", ps->num); printf("%c\n", ps->ch); } int main() { struct S s = { 100, 'L' };//结构体初始化时用{}。 test(&s); return 0; }
效果展示:
传的是地址因此我们可以通过地址找到 s ,因此也可以使用 . 来访问。
//我们将下面两句进行改写 printf("%d\n", ps->num); printf("%c\n", ps->ch); //改写为: printf("%d\n", (*ps).num); printf("%c\n", (*ps).ch);