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

字符串和C预处理器

本文参考C Primer Plus第四章学习

文章目录

  • 常量和预处理器
  • const限定符


1. 常量和预处理器

        有时,在程序中要使用常量。例如,可以这样计算圆的周长:

        circumference = 3.14159 * diameter;

        这里,常量3.14159 代表著名的常量 pi(π)。在该例中,输入实际值便可使用这个常量。然而,这种情况使用符号常量(symbolic constant)会更好。也就是说,使用下面的语句,计算机稍后会用实际值完成替换:

        circumference =pi * diameter;

        为什么使用符号常量更好?首先,常量名比数字表达的信息更多。请比较以下两条语句:

       owed = 0.015 * housevalue;

        owed = taxrate * housevalue;

        如果阅读一个很长的程序,第2条语句所表达的含义更清楚。

        另外,假设程序中的多处使用一个常量,有时需要改变它的值。毕竟,税率通常是浮动的。如果程序使用符号常量,则只需更改符号常量的定义,不用在程序中查找使用常量的地方,然后逐一修改。

        那么,如何创建符号常量?方法之一是声明一个变量,然后将该变量设置为所需的常量。可以这样写。

        float taxrate;

        taxrate = 0.015;

        这样做提供了一个符号名,但是taxrate 是一个变量,程序可能会无意间改变它的值。C语言还提供了一个更好的方案——C预处理器。第2章中介绍了预处理器如何使用#include 包含其他文件的信息,预处理器也可用来定义常量。只需在程序顶部添加下面一行:

        #define TAXRATE 0.015

        编译程序时,程序中所有的 TAXRATE 都会被替换成 0.015。这一过程被称为编译时替换(compile-time substitution)。在运行程序时,程序中所有的替换均已完成。通常,这样定义的常量也称为明示常量(manifest constant)。

        请注意格式,首先是#define,接着是符号常量名(TAXRATE),然后是符号常量的值(0.015)(注意,其中并没有=符号)。所以,其通用格式如下:

           #define NAME value

        实际应用时,用选定的符号常量名和合适的值来替换 NAME 和value。注意,末尾不用加分号,因为这是一种由预处理器处理的替换机制。为什么TAXRATE要用大写?用大写表示符号常量是C语言一贯的传统。这样,在程序中看到全大写的名称就立刻明白这是一个符号常量,而非变量。大写常量只是为了提高程序的可读性,即使全用小写来表示符号常量,程序也能照常运行。尽管如此,初学者还是应该养成大写常量的好习惯。

        另外,还有一个不常用的命名约定,即在名称前带c或k_前缀来表示常量(如,c_level或k_line)。

        符号常量的命名规则与变量相同。可以使用大小写字母、数字和下划线字符,首字符不能为数字。

#include<stdio.h>
#define PI 3.14159
int main(void)
{float area,circum,radius;printf("What is the radius of your pizza?\n");scanf("%f",&radius);area=PI*radius*radius;circum=2.0*PI*radius;printf("Your basic pizza parameters are as follows:\n");printf("circumference=%1.2f,area=%1.2f\n",circum,area);return 0;
}

        %1.2f表明,结果被四舍五入为两位小数输出。

        #define指令还可定义字符和字符串常量。前者使用单引号,后者使用双引号:

        #define BEEP '\a' 

         #define TEE 'T' 

         #define ESC '\033' 

         #define 00P "Now you have done it!" 

        记住,符号常量名后面的内容被用来替换符号常量。

        #define TOES=20        /*错误的格式*/

        如果这样做,替换TOES的是=20,而不是20。

2.const限定符

        const int MONTHS =12;        //MONTHS在程序中不可更改,值为12

        这使得MONTHS成为一个只读值。也就说,可以在计算中使用MONTHS,可以打印MONTHS,但是不能更改MONTHS。const用起来比#define更灵活。


        下一节会详细学习printf()函数和scanf()函数,一起努力吧!

http://www.lryc.cn/news/288888.html

相关文章:

  • Ultraleap 3Di新建项目之给所有的Joint挂载物体
  • 关于session每次请求都会改变的问题
  • 【leetcode题解C++】150.逆波兰表达式求值 and 239.滑动窗口最大值 and 347.前k个高频元素
  • 【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法
  • API设计模式:REST、GraphQL、gRPC与tRPC全面解析
  • C/C++ protobuf与json互转
  • Open CASCADE学习|圆柱螺旋线绘制原理探究
  • Python学习笔记--认识sys.argv
  • 【C++】入门基础
  • Nginx与keepalived实现集群
  • 初识MQRabbitMQ快速入门
  • javaMailSender 发送邮件,基于Spring Boot
  • 【汇总】解决Spring-Web与Spring-WebFlux冲突
  • maven 依赖配置补充
  • Pandas ------ 向 Excel 文件中写入含有合并表头的数据
  • kafka summary
  • 【新书推荐】2.6节 原码、反码和补码
  • docker 网络及如何资源(CPU/内存/磁盘)控制
  • 安装 nvm
  • Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码)
  • 多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测
  • 如何实现无公网IP实现远程访问MongoDB文件数据库
  • 华为防火墙USG6000V1的NAT实验
  • spark-flink设计思想之吸星大法-1
  • 力扣1312. 让字符串成为回文串的最少插入次数
  • qemu的安装
  • myql入门
  • 前端开发有没有必要转鸿蒙开发?
  • 《动手学深度学习(PyTorch版)》笔记1
  • 前端工程化之:webpack1-5(配置文件)