北京做网站男生工资,动易建网站,wordpress主题使用教程,招商外包服务公司文章目录 操作符详解一、上期扩展二、单目操作符三、逗号表达式四、下标访问[]、 函数调用()五、结构成员访问操作符六、操作符的属性#xff1a;优先级、结合性1. 优先级2. 结合性 操作符详解
上期回顾#xff1a;【C语言基础】#xff1a;操作符详解(一)
一、上期扩展
… 文章目录 操作符详解一、上期扩展二、单目操作符三、逗号表达式四、下标访问[]、 函数调用()五、结构成员访问操作符六、操作符的属性优先级、结合性1. 优先级2. 结合性 操作符详解
上期回顾【C语言基础】操作符详解(一)
一、上期扩展
【练习一】不能创建临时变量第三个变量 实现两个整数的交换。
方法一我们可以运用加减法来实现这个功能。 分析 交换前a 3b 5 我们先让 a b 然后把这个结果赋值给a也就是a a b 现在a的值变成了8而b的值还是5 接下来我们让a - b把这个表达式赋值给吧也就是b a - b 现在a的值是8b的值是3 最后我们只要将a - b这个表达式赋值给a就行啦也就是a a - b。 我们就会发现a和b的值发生了互换。 下面是代码实现
#includestdio.h
int main()
{int a 3;int b 5;printf(交换前a %d b %d\n, a, b);a a b;// a 8, b 5b a - b;// a 8, b 3a a - b;// a 5, b 3printf(交换后a %d b %d\n, a, b);return 0;
}很明显这种方法也存在着明显的不足那就是当a和b的值比较大时a和b可能会超出int的范围会出现溢出的现象导致无法进行值的互换。
方法二按位异或实现 上次我们学习了位操作符其中按位异或就是对应二进制位相同为0相异为1。根据这个特性我们也能实现这个功能。
分析 首先我们要了解按位异或中几种特殊的情况。比如a ^ aa ^ 0等等。 1101 1101 按位异或后的结果就是0,而任何数与0按位异或后还是它本身。 根据这个特点我们也能实现a和b的互换。 注意按位异或是支持交换律的。 下面说代码实现
#includestdio.h
int main()
{int a 3;int b 5;printf(交换前a %d b %d\n, a, b);a a ^ b;b a ^ b; // b a ^ b ^ b, b ^ b就等于0// 现在a a ^ b, b aa a ^ b;// a a ^ b ^ a, 因为a ^ a等于0// 现在a b, b aprintf(交换后a %d b %d\n, a, b);return 0;
}这种方法也存在着局限性首先要知道按位操作符的操作数必须是整数其次代码的可读性也不高不方便他人理解。
【练习二】编写代码实现求一个整数存储在内存中的二进制中1的个数。
方法一通过不断的去模2除2来获得二进制中1的个数。 注意这里是指补码。
#includestdio.h
int count_one_of_bite(unsigned int n)
{int count 0; // 计数while (n){if (n % 2 1)count;n n / 2;}return count;
}
int main()
{int n 0;scanf(%d, n);int ret count_one_of_bite(n);printf(二进制中一的个数%d\n, ret);return 0;
}方法二n (n - 1)
#includestdio.h
int count_one_of_bite(unsigned int n)
{int count 0; // 计数while (n){count;n n (n - 1);}return count;
}
int main()
{int n 0;scanf(%d, n);int ret count_one_of_bite(n);printf(二进制中一的个数%d\n, ret);return 0;
}二、单目操作符
单目操作符Unary Operator是一种只操作一个操作数的操作符。 !、、–、、、、-、~*、sizeof(类型) 正号 ()用于表示正数例如 5 表示正数 5。负号 (-)用于表示负数例如 -5 表示负数 5。递增 ()用于将操作数的值增加 1。可以作为前缀 (i) 或后缀 (i) 使用。递减 (–)用于将操作数的值减少 1。可以作为前缀 (–i) 或后缀 (i–) 使用。取址 ()用于获取变量的内存地址例如 x 表示变量 x 的地址。解引用 (*)用于访问指针所指向的内存中的值。例如*ptr 表示指针 ptr 指向的值。逻辑非 (!)用于求取操作数的逻辑非即取反。例如!x 表示 x 的逻辑非。按位取反 (~)用于对操作数执行按位取反操作。例如 ~ x 表示对 x 的每个位取反。
这些是 C 语言中常用的一些单目操作符。它们可以用来执行各种不同的操作如数值运算、递增递减、逻辑运算和位运算等。
三、逗号表达式
逗号表达式Comma Expression是一种由逗号操作符连接起来的表达式其特点是依次计算每个子表达式并返回最后一个子表达式的值作为整个表达式的值。逗号表达式的一般形式如下
expr1, expr2, expr3, ..., exprN在逗号表达式中逗号操作符 , 用于连接多个子表达式。在计算逗号表达式时每个子表达式都会按顺序依次执行但整个表达式的值将是最后一个子表达式的值。
逗号表达式在 C 语言中可以用于一些特定的场景如在 for 循环的初始化和迭代部分、函数调用参数中以及变量初始化等地方。例如在 for 循环中使用逗号表达式可以同时初始化多个变量
for (int i 0, j 10; i 10; i, j--) {// 循环体
}在函数调用参数中使用逗号表达式可以依次计算多个表达式并将它们作为函数的参数
int result myFunction(a, b, c1, d*2);逗号表达式的使用要谨慎因为它可能会使代码变得难以理解。在某些情况下使用逗号表达式可能降低代码的可读性因此应该根据具体情况慎重考虑是否使用。
【练习】
#includestdio.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;
}可以看到第六行是一个逗号表达式从左到右依次进行计算最后返回最右边的结果。
四、下标访问[]、 函数调用()
[ ] 下标引用操作符 操作数一个数组名 一个索引值(下标)
【举例】
int arr[10];//创建数组
arr[9] 10;//实用下标引用操作符。
[]的两个操作数是arr和9。函数调用操作符 接受一个或者多个操作数第⼀个操作数是函数名剩余的操作数就是传递给函数的参数。
【举例】
#include stdio.h
void test1()
{printf(hehe\n);
}
void test2(const char *str)
{printf(%s\n, str);
}
int main()
{test1(); //这⾥的()就是作为函数调⽤操作符。test2(hello world);//这⾥的()就是函数调⽤操作符。return 0;
}五、结构成员访问操作符
结构体 结构体Struct是一种用户自定义的数据类型用于将不同类型的数据组合成一个单独的实体。结构体能够将多个变量打包成一个整体方便操作和传递。 结构是⼀些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量如标量、数组、指针甚⾄是其他结构体。 结构体的声明包括两个部分结构体模板的定义和结构体变量的声明。
结构体模板的定义
struct 结构体名称 {数据类型 成员1;数据类型 成员2;// 更多成员...
};其中“结构体名称” 是用户定义的结构体类型的名称可以根据需要自行命名。“成员1”、“成员2” 等是结构体中的成员变量每个成员变量都有自己的数据类型。
【示例】坐标结构体的定义
struct Point {int x;int y;
};这个结构体定义了一个名为 Point 的结构体类型它有两个成员变量 x 和 y都是 int 类型。
结构体变量的声明
struct 结构体名称 变量名称;在结构体定义之后可以通过声明结构体变量来创建实际的结构体对象。
【示例】使用上述定义的 Point 结构体来声明一个名为 p 的结构体变量
struct Point p;现在变量 p 是一个具有两个成员变量的结构体对象。可以通过 . 运算符来访问结构体的成员变量例如 p.x 或 p.y。
另外C 语言还提供了一种更简洁的方式来声明结构体变量即使用 typedef 关键字
typedef struct {数据类型 成员1;数据类型 成员2;// 更多成员...
} 结构体名称;这样就可以直接使用 结构体名称 来定义结构体变量而不需要再写 struct 关键字。例如
typedef struct {int x;int y;
} Point;
Point p;这里的 Point 就是一个结构体类型并且可以直接用于声明结构体变量。
//代码1变量的定义
struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2//代码2:初始化。
struct Point p3 { 10, 20 };struct Stu //类型声明
{char name[15];//名字int age; //年龄
};struct Stu s1 { zhangsan, 20 };//初始化
struct Stu s2 { .age 20, .name lisi };//指定顺序初始化//代码3
struct Node
{int data;struct Point p;struct Node* next;
}n1 { 10, {4,5}, NULL }; //结构体嵌套初始化
struct Node n2 { 20, {5, 6}, NULL };//结构体嵌套初始化结构体成员的直接访问 结构体成员的直接访问是通过点操作符 . 访问的。点操作符接受两个操作数。如下所示
#include stdio.h
struct Point
{int x;int y;
}p { 1,2 };
int main()
{printf(x: %d y: %d\n, p.x, p.y);return 0;
}使用方式结构体变量.成员名
结构体成员的间接访问 有时候我们得到的不是⼀个结构体变量而是得到了⼀个指向结构体的指针。如下所示
#include stdio.h
struct Point
{int x;int y;
};
int main()
{struct Point p {3, 4};struct Point *ptr p;ptr-x 10;ptr-y 20;printf(x %d y %d\n, ptr-x, ptr-y);return 0;
}使用方式结构体指针-成员名
综合举例
#include stdio.h
#include string.h
struct Stu
{char name[15];//名字int age; //年龄
};
void print_stu(struct Stu s)
{printf(%s %d\n, s.name, s.age);
}
void set_stu(struct Stu* ps)
{strcpy(ps-name, 李四);ps-age 28;
}
int main()
{struct Stu s { 张三, 20 };print_stu(s);set_stu(s);print_stu(s);return 0;
}六、操作符的属性优先级、结合性
C语⾔的操作符有2个重要的属性优先级、结合性这两个属性决定了表达式求值的计算顺序。
1. 优先级
优先级指的是如果⼀个表达式包含多个运算符哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的。
3 4 * 5;上⾯⽰例中表达式 3 4 * 5 ⾥⾯既有加法运算符 ⼜有乘法运算符 * 。由于乘法的优先级⾼于加法所以会先计算 4 * 5 ⽽不是先计算 3 4 。
2. 结合性
如果两个运算符优先级相同优先级没办法确定先计算哪个了这时候就看结合性了则根据运算符是左结合还是右结合决定执行顺序。⼤部分运算符是左结合(从左到右执行)少数运算符是右结合(从右到左执行)比如赋值运算符( )。
5 * 6 / 2;上面示例中 * 和 / 的优先级相同它们都是左结合运算符所以从左到右执行先计算 5 * 6 再计算 6 / 2 。 运算符的优先级顺序很多下⾯是部分运算符的优先级顺序按照优先级从高到低排列建议大概记住这些操作符的优先级就行其他操作符在使用的时候查看下面表格就可以了。 • 圆括号 () • ⾃增运算符 ⾃减运算符 – • 单⽬运算符 和 - • 乘法 * 除法 / • 加法 减法 - • 关系运算符 、 等 • 赋值运算符 由于圆括号的优先级最高可以使用它改变其他运算符的优先级。 文章转载自: http://www.morning.ypbdr.cn.gov.cn.ypbdr.cn http://www.morning.fwdln.cn.gov.cn.fwdln.cn http://www.morning.ptwqf.cn.gov.cn.ptwqf.cn http://www.morning.fmjzl.cn.gov.cn.fmjzl.cn http://www.morning.rpzth.cn.gov.cn.rpzth.cn http://www.morning.qdxwf.cn.gov.cn.qdxwf.cn http://www.morning.cpkcq.cn.gov.cn.cpkcq.cn http://www.morning.mbmh.cn.gov.cn.mbmh.cn http://www.morning.gftnx.cn.gov.cn.gftnx.cn http://www.morning.hrzymy.com.gov.cn.hrzymy.com http://www.morning.msgcj.cn.gov.cn.msgcj.cn http://www.morning.tbbxn.cn.gov.cn.tbbxn.cn http://www.morning.lysrt.cn.gov.cn.lysrt.cn http://www.morning.gpnwq.cn.gov.cn.gpnwq.cn http://www.morning.mhfbp.cn.gov.cn.mhfbp.cn http://www.morning.dxqfh.cn.gov.cn.dxqfh.cn http://www.morning.myrmm.cn.gov.cn.myrmm.cn http://www.morning.njpny.cn.gov.cn.njpny.cn http://www.morning.lflsq.cn.gov.cn.lflsq.cn http://www.morning.gwtbn.cn.gov.cn.gwtbn.cn http://www.morning.rcklc.cn.gov.cn.rcklc.cn http://www.morning.lgwpm.cn.gov.cn.lgwpm.cn http://www.morning.wxfjx.cn.gov.cn.wxfjx.cn http://www.morning.mqxrx.cn.gov.cn.mqxrx.cn http://www.morning.qzmnr.cn.gov.cn.qzmnr.cn http://www.morning.mtymb.cn.gov.cn.mtymb.cn http://www.morning.nffwl.cn.gov.cn.nffwl.cn http://www.morning.xfyjn.cn.gov.cn.xfyjn.cn http://www.morning.dgckn.cn.gov.cn.dgckn.cn http://www.morning.nzcgj.cn.gov.cn.nzcgj.cn http://www.morning.rgpy.cn.gov.cn.rgpy.cn http://www.morning.sbdqy.cn.gov.cn.sbdqy.cn http://www.morning.nhdmh.cn.gov.cn.nhdmh.cn http://www.morning.gqddl.cn.gov.cn.gqddl.cn http://www.morning.ryzgp.cn.gov.cn.ryzgp.cn http://www.morning.sgfnx.cn.gov.cn.sgfnx.cn http://www.morning.rnygs.cn.gov.cn.rnygs.cn http://www.morning.qpntn.cn.gov.cn.qpntn.cn http://www.morning.bwzzt.cn.gov.cn.bwzzt.cn http://www.morning.rxgnn.cn.gov.cn.rxgnn.cn http://www.morning.xqltq.cn.gov.cn.xqltq.cn http://www.morning.kxyqy.cn.gov.cn.kxyqy.cn http://www.morning.xdwcg.cn.gov.cn.xdwcg.cn http://www.morning.lbjdx.cn.gov.cn.lbjdx.cn http://www.morning.grpfj.cn.gov.cn.grpfj.cn http://www.morning.nkdmd.cn.gov.cn.nkdmd.cn http://www.morning.yqjjn.cn.gov.cn.yqjjn.cn http://www.morning.sfsjh.cn.gov.cn.sfsjh.cn http://www.morning.pnntx.cn.gov.cn.pnntx.cn http://www.morning.wfpmt.cn.gov.cn.wfpmt.cn http://www.morning.gwxwl.cn.gov.cn.gwxwl.cn http://www.morning.bwgrd.cn.gov.cn.bwgrd.cn http://www.morning.fwgnq.cn.gov.cn.fwgnq.cn http://www.morning.qdxwf.cn.gov.cn.qdxwf.cn http://www.morning.lizpw.com.gov.cn.lizpw.com http://www.morning.zcsyz.cn.gov.cn.zcsyz.cn http://www.morning.ftmp.cn.gov.cn.ftmp.cn http://www.morning.kltmt.cn.gov.cn.kltmt.cn http://www.morning.dndjx.cn.gov.cn.dndjx.cn http://www.morning.bhbxd.cn.gov.cn.bhbxd.cn http://www.morning.yqkxr.cn.gov.cn.yqkxr.cn http://www.morning.gtylt.cn.gov.cn.gtylt.cn http://www.morning.gchqy.cn.gov.cn.gchqy.cn http://www.morning.jpwmk.cn.gov.cn.jpwmk.cn http://www.morning.jstggt.cn.gov.cn.jstggt.cn http://www.morning.srrrz.cn.gov.cn.srrrz.cn http://www.morning.zkgpg.cn.gov.cn.zkgpg.cn http://www.morning.dqxph.cn.gov.cn.dqxph.cn http://www.morning.xgkxy.cn.gov.cn.xgkxy.cn http://www.morning.hcsnk.cn.gov.cn.hcsnk.cn http://www.morning.wjxtq.cn.gov.cn.wjxtq.cn http://www.morning.tfqfm.cn.gov.cn.tfqfm.cn http://www.morning.cpmwg.cn.gov.cn.cpmwg.cn http://www.morning.ptwzy.cn.gov.cn.ptwzy.cn http://www.morning.mftzm.cn.gov.cn.mftzm.cn http://www.morning.ngkng.cn.gov.cn.ngkng.cn http://www.morning.fyglr.cn.gov.cn.fyglr.cn http://www.morning.ghlyy.cn.gov.cn.ghlyy.cn http://www.morning.gjfym.cn.gov.cn.gjfym.cn http://www.morning.hkysq.cn.gov.cn.hkysq.cn