短路运算

为什么把这个又扯出来呢?
学习链表相关知识时遇到一些问题
回头记忆一下。

逻辑运算符

!(逻辑非)
&&(逻辑与)
|| (逻辑或)
c语言将逻辑运算符两侧的表达式当成“条件表达式”。
将条表的结果按两种情况对待:0为假,非0为真。

短路运算

短路运算为了防止非法内存访问而使用。
短路运算仅仅发生在逻辑运算表达式中,且仅发生在&&和||运算中。
&&与运算优先级高于||或运算。

规则
若在&&左侧出现0(假)或者在||左侧出现非0(真),则&&和||右侧表达式被忽略无视。

练习下

#include<stdio.h>

int main()
{
	int i;
	int j = 2;
	int k;
	
	i = 1;
	k = i-- || ++j;
	printf("%d %d %d\n",i,j,k);//0 2 1
	
	i = 0;                      
	//i=0,k=0; i=1 j=2
    k = i++ && ++i && ++j;
	printf("%d %d %d\n",i,j,k);//i=1,k=0,j=2
	
	i = 1;                     
	k = i-- || ++j && ++i;
	//k = 1 || (++j && ++i);
	//k = 1 || A (A被短路) 
	printf("%d %d %d\n",i,j,k);//i=0,j=2,k=1
	
	i = 1;                    
	//k=1 || (++j || ++i);
	k = i-- || ++j || ++i;
	printf("%d %d %d\n",i,j,k);//i=0,j=2,k=1 
	
	i = 0;
	//k=(i++ && ++j) || ++i; 
	//k=(0 && ++j) ||++i; i=1
	//k=1,j=2,i=2
	k = i++ && ++j || ++i;
	printf("%d %d %d\n",i,j,k);//i=2,j=2,k=2
	
	i = 1;
	k = i-- || ++i && ++j;
	//k=i-- || (++i && ++j);
	//k=i-- || (i=2,j=2);
	//k= 1,i=0,j=2
	printf("%d %d %d\n",i,j,k);//i=0,j=2,k=1
	
	return 0;
 } 

好几链表的话以后提及
现在简单的说一点点链表准备工作
(虽然写的这个东西有一点点只可意会不可言传的感觉…)
要求:表示屏幕上点信息,行、列坐标构成
typedef struct POINT{
int row;
int col;
struct POINT *next;
}POINT
POINT a,b,c,*p;
a.row = 1; a.col = 4;
b.row = 5; b.col = 6;
c.row = 7; c.col = 8;
特别的,a.next->row 其值等价于b.row
a的next成员所指向的实例的row成员
如果上面定义p=&a;
p->row的值即为1
p = p->next;
类似于这种语句的多次执行,可以实现将p指针的指向在整个“链条”的各个节点上依次“滑动”,可以以此实现对此链表中的每一个节点的访问(遍历)
如果这是一个空链,a的值为0;
for(p = 头结点首地址; p-> next != NULL; p = p->next)
上述用不了了,直接跳出循环
for(p = 头结点首地址; p&& p-> next != NULL; p = p->next)
继续进行。
好吧。就这样。

发布了26 篇原创文章 · 获赞 4 · 访问量 2399

猜你喜欢

转载自blog.csdn.net/weixin_43257196/article/details/86519898