当前位置: 首页 > news >正文

赋值语句@赋值表达式@便于阅读和便于理解的比较

文章目录

    • 赋值表达式
      • 便于阅读和便于理解的比较

赋值表达式

对于经验比较丰富的C 语言程序员,可以把这个字符复制程序编写得更精炼一些。在C 语言中,类似于 c = getchar() 之类的赋值操作是一个表达式,并且具有一个值,即赋值后左边变量保存的值。

也就是说, 赋值可以作为更大的表达式的一部分出现

#include <stdio.h>/* copy input to output; 2nd version  */
main()
{int a = 1, b = 3, c, d, e, f;d = (c = a + b) - 2; // 这个语句相当于c=a+b;d=c-2;也就是将c,d的赋值操作在一个语句内完成f = e = b - a;       //将e,f都赋值为b-a;相当于e=b-a;f=e;printf("c=%d;d=%d;\n", c, d);printf("e=%d;f=%d;\n", e, f);
}

如果将为c赋值的操作放在while循环语句的测 试部分中,上述字符复制程序便可以改写成下列形式:

#include <stdio.h>/* copy input to output; 2nd version  */
main()
{int c;while ((c = getchar()) != EOF)putchar(c);
}

在该程序中,while 循环语句首先读一个字符并将其赋值给c,然后测试该字符是否为文件 结束标志。如果该字符不是文件结束标志,则执行while语句体,并打印该字符。随后重复 执行while语句。当到达输入的结尾位置时,while循环语句终止执行,从而整个main函 数执行结束。
以上这段程序将输入集中化,getchar函数在程序中只出现了一次,这样就缩短了程序, 整个程序看起来更紧凑。习惯这种风格后,读者就会发现按照这种方式编写的程序更易阅读。 我们经常会看到这种风格。(不过,如果我们过多地使用这种类型的复杂语句,编写的程序可能会很难理解,应尽量避免这种情况。)

更容易阅读,或者方便阅读不表示容易理解,比如简短的语句看似简单,但是可能应用了更多的技巧,比朴素啰嗦的语句更难理解

对while语句的条件部分来说,赋值表达式两边的圆括号不能省略。不等于运算符!=的 优先级比赋值运算符=的优先级要高,这样,在不使用圆括号的情况下关系测试!=将在赋值= 操作之前执行。

因此语句 c = getchar() != EOF 等价于语句 c = (getchar() != EOF) 该语句执行后,c的值将被置为0 或1

便于阅读和便于理解的比较

下面三个版本的代码功能等价,但是阅读的方便性和理解的难易程度各不相同;在下面的例子中,两个属性类似于此消彼长

第一种最直观,最容易理解,但是代码量最多;第二种到第三种语句越发简洁,但是需要掌握的技巧越多

不过随着经验的增加,或者对于有经验的人来说,最后一种不仅代码格式上工整对称,功能明确,是优先选择的写法

下面是一个strcpy字符串复制功能的简易版本(准库(<string.h>)中提供的函数strcpy把目标字符串作为函数值返回)

/* strcpy:  copy t to s; pointer version */
void strcpy(char *s, char *t)
{int i;i = 0;while ((*s = *t) != '\0'){s++;t++;}
}

在下面的版本中,s 和t 的自增运算放到了循环的测试部分中。表达式*t++的值是执行自增运算之前t所指向的字符。后缀运算符++表示在读取该字符之后才改变t的值。同样的道理,在s 执行自增运算之前,字符就被存储到了指针s 指向的旧位置。

该字符值同时也用来和空 字符’\0’进行比较运算,以控制循环的执行。最后的结果是依次将t指向的字符复制到s指向的位置,直到遇到结束符’\0’为止(同时也复制该结束符),

/* strcpy:  copy t to s; pointer version 2 */
void strcpy(char *s, char *t)
{while ((*s++ = *t++) != '\0');
}

为了更进一步地精炼程序,我们注意到,表达式同’\0’的比较是多余的,因为只需要判断表达式的值是否为0 即可。因此,该函数可进一步写成下列形式:

/* strcpy:  copy t to s; pointer version 2 */
void strcpy(char *s, char *t)
{while ((*s++ = *t++));
}

该函数初看起来不太容易理解,但这种表示方法是很有好处的,我们应该掌握这种方法,C 语言程序中经常会采用这种写法。


http://www.mrgr.cn/news/64097.html

相关文章:

  • 【docker系列】创建博客 halo 2.11
  • Scala_【2】变量和数据类型
  • 【Linux】flock 文件级别的锁定
  • selenium学习笔记(二)
  • 【论文阅读笔记】Learning to sample
  • Etcd注册中心基本实现
  • 【Linux中的第一个小程序】进度条及printf打印彩色字符
  • 《Python修炼秘籍》01踏上编程之旅
  • 满秩分解与奇异值分解
  • 机器人大模型GR2——在大规模视频数据集上预训练且机器人数据上微调,随后预测动作轨迹和视频(含GR1详解)
  • 树的遍历(先,中,后)
  • 【无人机设计与控制】改进无人机三维路径规划(蜣螂优化算法)Matlab程序
  • 除甲醛开窗通风的正确方法 消除甲醛的最好方法
  • 如何引用一个已经定义过的全局变量?
  • 【含文档】基于ssm+jsp的智慧篮球馆预约(含源码+数据库+lw)
  • 【含文档】基于Springboot+Vue的工商局商家管理系统 (含源码数据库+LW)
  • 基于javaweb(springboot+mybatis)网站建设服务管理系统设计和实现以及文档报告设计
  • ssm毕业设计选题系统+jsp
  • HTML 基础标签——表格标签<table>
  • cangjie仓颉程序设计-怎么排序(二)
  • 从头开始学PHP之面向对象
  • 2025生物发酵展(济南)为生物制造产业注入新活力共谱行业新篇章
  • 仓颉刷题录-二维数组(二)
  • 第15届蓝桥杯省赛真题剖析-2024年8月24日Scratch中级组
  • 使用Github下载YOLO v5项目教程
  • 面试题:JVM(六)