抚州做网站公司哪家好,布吉商城网站建设,公司的网站备案,织梦网站图标更换目录 0.过渡0.1 不创建临时变量#xff0c;交换两数0.2 求整数转成二进制后1的总数 1.单目表达式2. 逗号表达式3. 下标访问[ ]、函数调用( )3.1 下标访问[ ]3.2 函数调用( ) 4. 结构体成员访问操作符4.1 结构体4.1.1 结构体的申明4.1.2 结构体变量的定义和初始化 4.2 结构体成… 目录 0.过渡0.1 不创建临时变量交换两数0.2 求整数转成二进制后1的总数 1.单目表达式2. 逗号表达式3. 下标访问[ ]、函数调用( )3.1 下标访问[ ]3.2 函数调用( ) 4. 结构体成员访问操作符4.1 结构体4.1.1 结构体的申明4.1.2 结构体变量的定义和初始化 4.2 结构体成员的访问4.2.1 结构体成员的直接访问4.2.2 结构体成员的间接访问 5. 操作符的属性优先级、结合性 前半部分的操作符详解在这个链接——操作符详解1 0.过渡 在操作符1中我们最后讲了位操作符的概念这里我想举几个例子加深理解 0.1 不创建临时变量交换两数 这是一道很变态的面试题首先我们可以看看下面两个等式 a ^ a 0a ^ 0 a 接着我们来理解一下这道变态面试题的答案 #include stdio.h
int main()
{int a 10;int b 20;a a^b;b a^b;//根据上面的代码这里的a^ba^b^ba^0a,这里相当于把a给ba a^b;//根据上面的代码这里的a^ba^a^b0^bb,这里相当于把b给aprintf(a %d b %d\n, a, b);return 0;
}运行结果如下 0.2 求整数转成二进制后1的总数 首先我们看一下当一个二进制数和1按位与后的结果 我们发现当一个二进制的最后一位是 0 时和1按位与后的结果为0当最后一位为1时按位与1后的结果时1这样就相当于把二进制的最后一位给取出来了那么我只要加个循环把每一位都取出来再相加即可这里我为了方便只写了八个二进制数×86环境为32位×64环境为64位所以代码如下 #include stdio.hint main()
{int num -1;int i 0;int count 0;//计数for(i0; i32; i){if( num (1 i) )count;}printf(⼆进制中1的个数 %d\n,count);return 0;
}但是这样有一个缺点就是不管二进制是多少都要循环32遍如果二进制只是1那31遍循环都白循环了所以我们想想是否还有更加高效的代码呢比如我们可以试试 num(num-1) 我们会发现最后的1消失了同理如果我们把结果再重复一次运算 我们会发现倒数第二个1也消失了如果我们再重复一次会不会倒数第四位的1也消失呢 我们发现确实如此那么我们只要再加上num ! 0 这个条件就可以循环起来了代码如下 #include stdio.hint main()
{int num -1;int i 0;int count 0;//计数while(num){count;num num (num-1);}printf(⼆进制中1的个数 %d\n,count);return 0;
}1.单目表达式 单目操作符有这些、、–、、*、、-、~ 、sizeof、(类型) 2. 逗号表达式 顾名思义就是一些表达式用逗号连接起来如图 逗号表达式从左向右依次执行。整个表达式的结果是最后⼀个表达式的结果。 3. 下标访问[ ]、函数调用( )
3.1 下标访问[ ] 操作数⼀个数组名 ⼀个索引值 3.2 函数调用( ) 接受⼀个或者多个操作数第⼀个操作数是函数名剩余的操作数就是传递给函数的参数。 #include stdio.hvoid test1()
{printf(hehe\n);
}void test2(const char *str)
{printf(%s\n, str);
}int main()
{test1(); //这⾥的()就是作为函数调⽤操作符。test2(hello bit.);//这⾥的()就是函数调⽤操作符。return 0;
}4. 结构体成员访问操作符
4.1 结构体 C语⾔已经提供了内置类型如char、short、int、long、float、double等但是只有这些内置类型还是不够的假设我想描述学生描述⼀本书这时单⼀的内置类型是不行的。描述⼀个学生需要名字、年龄、学号、身高、体重等描述⼀本书需要作者、出版社、定价等。C语言为了解决这个问题增加了结构体这种自定义的数据类型让程序员可以自己创造适合的类型。结构是⼀些值的集合这些值称为成员变量。结构的每个成员可以是不同类型的变量如标量、数组、指针甚⾄是其他结构体 4.1.1 结构体的申明 比如描述一个学生 struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
}a;//分号不能丢这里的a为结构体类型的全局变量4.1.2 结构体变量的定义和初始化
//变量的定义
struct Point
{int x;int y;
}p1; //声明类型的同时定义变量p1struct Point p2; //定义结构体变量p2
struct Point p3 {10, 20};//初始化struct Stu //类型声明
{char name[15];//名字int age; //年龄
};struct Stu s1 {zhangsan, 20};//初始化
struct Stu s2 {.age20, .namelisi};//指定顺序初始化//嵌套结构
struct Node
{int data;struct Point p;struct Node* next;
}n1 {10, {4,5}, NULL}; //结构体嵌套初始化struct Node n2 {20, {5, 6}, NULL};//结构体嵌套初始化4.2 结构体成员的访问
4.2.1 结构体成员的直接访问 结构体成员的直接访问是通过点操作符.访问的。点操作符接受两个操作数。如下所示 #include stdio.hstruct Point
{int x;int y;
}p {1,2};int main()
{printf(x: %d y: %d\n, p.x, p.y);return 0;
}使用方式结构体变量 . 成员名 4.2.2 结构体成员的间接访问 有时候我们得到的不是⼀个结构体变量而是得到了⼀个指向结构体的指针。如下所示 #include stdio.hstruct 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;
}使用方式结构体指针 - 成员名 5. 操作符的属性优先级、结合性 链接在这里——操作符优先级结合性是指在遇到相同优先级的操作符的时候的运算顺序 最后 恭喜你又遥遥领先了别人