【重学C语言】四、常量、变量和基本数据类型

news2024/11/17 13:51:46

【重学C语言】四、常量、变量和基本数据类型

  • 1. 常量和变量
    • 1.1 常量
      • 1.1.1 直接常量
        • 1.1.1.1 整数常量
        • 1.1.1.2 浮点常量
        • 1.1.1.3 字符常量
        • 1.1.1.4字符串常量
      • 1.1.2符号常量
    • 1.2 标识符
    • 1.3 变量
      • 1.3.1 变量的定义
      • 1.3.2 左值(Lvalues)和右值(Rvalues)
  • 2. 类型转换
    • 2.1 自动类型转换
    • 2.2 强制类型转换

1. 常量和变量

1.1 常量

常量是在程序执行过程中,其值不发生改变的量,分为直接常量符号常量两种。

1.1.1 直接常量

直接常量又分为整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。

1.1.1.1 整数常量

整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制(VS2019支持二进制常量表示:0b或0B表示二进制)。

整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。

80			//十进制
0120		//八进制
0X50		//十六进制
0B1010000	//二进制
1.1.1.2 浮点常量

浮点常量由整数部分、小数点、小数部分和指数部分组成。可以使用小数形式或者指数形式来表示浮点常量。

当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。

0.25;		//合法
.25;		//合法 	相当于0.25
5.;			//合法 	相当于5.0

314159E-5;	//合法	3.14159;
314159E;	//非法	应输入指数值而非“;”
.E-5;		//非法	缺少整数或者分数
1.1.1.3 字符常量

字符常量是括在单引号之间的,例如,‘x’ 。

字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。
ASCII 码字符表
在这里插入图片描述
转义字符:一种特殊的字符常量

  • 以反斜线 \ 开头,后跟一个或几个字符。
  • 转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。
  • 转义字符中只能使用小写字母,每个转义字符只能看作一个字符。
  • \v 垂直制表和 \f 换页符对屏幕没有任何影响,但会影响打印机执行响应操作。

下表列出了一些这样的转义序列码:

转义序列含义ASCII码值(十进制)
\\\ 字符092
\’’ 字符039
\"" 字符034
\a警报铃声007
\b退格键008
\f换页符012
\n换行符010
\r回车013
\t水平制表符009
\v垂直制表符011
\0空字符(NULL)000
\ddd一到3位的八进制数-
\xhh一到2位的十六进制数-

注意数据溢出,如 \520 代表 80 可是我们算的是336,由于字符数据最多256,这里发生了数据溢出,所以是 80

1.1.1.4字符串常量

字符串字面值或常量是括在双引号 “” 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。

可以使用空格做分隔符,把一个很长的字符串常量进行分行。

下面的实例显示了一些字符串常量。下面这三种形式所显示的字符串是相同的。

"hello,world";

"hello,\
world";

"hello,""w""orld";

1.1.2符号常量

在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用前必须先定义,一般形式为:#define 标识符 常量值

其中#define是一条编译预处理命令,称为宏定义命令,其功能是把该标识符定义为其后的常量值,该标识符称为符号常量。一个#define命令只能定义一个符号常量,若要定义多个符号常量,需要使用多个#define命令。

示例:

#include<stdio.h>

#define PI 3.1415

int main()
{
	printf("圆的面积为:%lf",PI*3*3);   
    return 0;
}
//output:圆的面积为:28.273500

请注意,把常量定义为大写字母形式,是一个很好的编程习惯。

1.2 标识符

标识符是编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系。

C语言中把标识符分为三类:关键字,预定义标识符,用户自定义标识符 ,对于自定义标识符有如下规则和规范

命名基本规则

  • 标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,并且首字符不能是数字,但可以是字母或者下划线。例如,正确的标识符:abc,a1,prog_to。
  • 不能把C语言关键字作为用户标识符,例如if,for,while等。
  • 标识符对大小写敏感,即严格区分大小写。
  • 标识符命名应做到**“见名知意”**,例如,长度(length),求和、总计(sum),圆周率(pi)……

常用命名规范

  • 小驼峰
    • 第一个单词首字母小写,后面其他单词首字母大写
    • 如:myName youAge
  • 大驼峰
    • 所有单词的首字母都大写
    • 如MyName YouAge
  • 匈牙利
    • 在标识符前面加上小写字母作为前缀,标识出变量的作用域,类型等等
    • g_ 全局变量
    • c_ 常量
    • s_ 静态成员变量
    • m_ 成员变量

提示:大家写项目的时候,保持一种标准,建议使用小驼峰(工作了看企业需求)

1.3 变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。

每种变量都有对应的数据类型,有不同大小的存储空间*(为了适应不同的数据类型,也为了节省内存)*,在C语言中主要有如下基础数据类型

在这里插入图片描述

在C语言中本来是不存在bool类型的,但在C99标准中加入了bool类型。加上stdbool头文件即可使用!

  • 实型默认都是double型
  • 整型默认都是int型
  • 所有类型默认都是有符号(signed)型

1.3.1 变量的定义

定义变量就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。

不过,我们必须给变量取一个合适的名字,就好像每个人都有自己的名字一样,否则就难以区分了。

type variable_list

在这里,type 必须是一个有效的 C 数据类型,可以是 char、int、float、double 或任何用户自定义的对象,variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:

int age,money;
char sex;
float PI;

变量可以在定义的时候被赋值,这种在定义是指定一个初始值的方式叫做变量的初始化。

int age = 18;	//初始化
age = 19;		//赋值

不带初始化的定义:变量的初始值是未定义的。

1.3.2 左值(Lvalues)和右值(Rvalues)

C 中有两种类型的表达式:

  1. 左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
  2. 右值(rvalue):右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。下面是一个有效的语句:

int g = 20;		// g是左值

但是下面这个就不是一个有效的语句,会生成编译时错误:

10 = 20;		// 10是右值

2. 类型转换

数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。

类型转换一般是为了解决如下的一些问题:

  1. 算术运算中或者逻辑判断表达式中操作时,不匹配的时候。
  2. 赋值时,如果左右操作数类型不匹配。
  3. 函数传递进去的实参和匹配的形参对应不上。
  4. 函数返回的表达式的类型和函数返回类型不匹配

C语言中类型转换主要分为两种:

  • 自动类型转换:编译器自动将左右操作数变成相同类型去计算。
  • 隐式类型转换:程序开发者主观上去将类型强制转换。

2.1 自动类型转换

自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

  1. 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如:
float f = 100;

100 是 int 类型的数据,需要先转换为 float 类型才能赋值给变量 f。再如:

int n = f;

f 是 float 类型的数据,需要先转换为 int 类型才能赋值给变量 n。

在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真(数据输入和输出不一致),或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。

  1. 在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下:
  • 转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。
  • 所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。
  • char 和 short 参与运算时,必须先转换成 int 类型。

在这里插入图片描述

自动类型转换示例:

#include<stdio.h>
int main()
{    
    float PI = 3.14159;    
    int s1, r = 5;    
    double s2;    
    s1 = r * r * PI;    
    s2 = r * r * PI;    
    printf("s1=%d, s2=%f\n", s1, s2);    
    return 0;
}

运行结果:
s1=78, s2=78.539749

在计算表达式r*r*PI时,r 和 PI 都被转换成 double 类型,表达式的结果也是 double 类型。但由于 s1 为整型,所以赋值运算的结果仍为整型,舍去了小数部分,导致数据精度丢失。

2.2 强制类型转换

自动类型转换是编译器根据代码的上下文环境自行判断的结果,有时候并不是那么“智能”,不能满足所有的需求。如果需要,程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。

强制类型转换的格式为:

(type) expression

type为目标类型名称,expression为表达式。例如:

(float) a;  // 将变量 a 转换为 float 类型
(int)(x+y);  //  把表达式 x+y 的结果转换为 int 整型
(float) 100;  // 将数值 100(默认为int类型)转换为 float 类型

下面是一个需要强制类型转换的经典例子:

#include <stdio.h>
int main()
{    
    int sum = 315;  // 总数    
    int count = 7;  // 数目    
    double average;  // 平均数    
    average = (double) sum / count;    
    printf("Average is %lf!\n", average);    
    return 0;
}
output:Average is 44.714286!

sum 和 count 都是 int 类型,如果不进行干预,那么sum / count的运算结果也是 int 类型,小数部分将被丢弃;虽然是 average 是 double 类型,可以接收小数部分,但是心有余力不足,小数部分提前就被“阉割”了,它只能接收到整数部分,这就导致除法运算的结果严重失真。

既然 average 是 double 类型,为何不充分利用,尽量提高运算结果的精度呢?为了达到这个目标,我们只要将 sum 或者 count 其中之一转换为 double 类型即可。上面的代码中,我们将 sum 强制转换为 double 类型,这样sum / count的结果也将变成 double 类型,就可以保留小数部分了,average 接收到的值也会更加精确。

注意不要写作(double) (sum / count),这样写运算结果将是 44.000000,仍然不能保留小数部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1396066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

a-range-picker获取开始和结束时间

效果图 代码块 <a-range-picker change"onChangeRangeDate" format"YYYY-MM-DD"/>onChangeRangeDate(value,dateString){this.startDatedateString[0]this.endDatedateString[1]}

抓包工具Fiddler的下载、安装、配置、基本使用

文章目录 前言一、Fiddler下载二、Fiddler安装三、打开Fiddler四、Fiddler显示菜单栏及菜单栏功能基本介绍五、Fiddler的作用六、Fiddler的工作原理七、Fiddler基本功能使用1.导包2.规则设置Rules&#xff1a; 八、Fiddler设置抓取HTTPS的包九、抓取APP包必须设置十、Fiddler过…

谷达冠楠科技:抖音开网店新手小白可以卖的产品

随着互联网的发展&#xff0c;越来越多的人选择在网上开设自己的店铺。而抖音作为目前最火的短视频平台&#xff0c;也提供了开店的功能。那么&#xff0c;对于新手小白来说&#xff0c;抖音开网店可以卖哪些产品呢? 我们可以考虑的是服装类商品。抖音上有很多时尚博主&#x…

极致画质与流畅播放的完美结合,只在ProVideoPlayer for Mac!

ProVideoPlayer for Mac 是一款功能强大的专业级视频播放软件&#xff0c;旨在提供出色的用户体验和无与伦比的功能。以下是它的一些主要功能介绍&#xff1a; 多格式兼容&#xff1a;ProVideoPlayer for Mac 支持广泛的视频格式&#xff0c;包括常见的MP4、AVI、MOV&#xff0…

鸿蒙开发(五)鸿蒙UI开发概览

从用户角度来讲&#xff0c;一个软件拥有好看的UI&#xff0c;那是锦上添花的事情。再精确的算法&#xff0c;再厉害的策略&#xff0c;最终都得通过UI展现给用户并且跟用户交互。那么&#xff0c;本篇一起学习下鸿蒙开发UI基础知识&#xff0c;认识下各种基本控件以及使用方式…

基于Java图书商城系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

三星Galaxy S24 系列了发布会预热新品:Galaxy Ring 智能戒指亮相

在三星 Galaxy S24 系列发布会上&#xff0c;他们不仅带来了新款手机&#xff0c;还意外地推出了一款智能指环 ——Galaxy Ring&#xff01;没错&#xff0c;就是戴在手指上的那种智能设备&#xff01; 在发布会的尾声&#xff0c;三星放出了一段简短的预告片&#xff0c;让我…

美摄视频SDK的HDR格式编辑方案

在当今的视觉媒体时代&#xff0c;高动态范围&#xff08;HDR&#xff09;技术已成为高质量视频内容的标配。为了满足企业对高效、高质量视频处理的需求&#xff0c;美摄科技推出了业界领先的视频SDK&#xff0c;全面支持多种HDR标准的图像视频进行处理。 一、核心优势 HDR全…

【Docker】安装nacos以及实现负载均衡

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 前言 一.nacos单个部署 1.镜像拉取 …

Java实现厦门旅游电子商务预订系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

2024-01-18 在Android Studio中,可以通过修改build.gradle文件(位于你的应用模块目录下)来自定义生成的APK名称

一、在Android Studio中&#xff0c;可以通过修改build.gradle文件&#xff08;位于你的应用模块目录下&#xff09;来自定义生成的APK名称&#xff0c;在build.gradle里面增加下面的代码 applicationVariants.all { variant ->variant.outputs.all {outputFileName "…

Segment Anything:SAM系列模型总结

Segment Anything | Meta AIhttps://segment-anything.com/ SAM https://arxiv.org/pdf/2304.02643.pdf 新的图像分割任务:这样的任务需要实现零样本泛化。新的模型&#xff1a;Segment Anthing Model。目前分为vit_b&#xff0c;vit_l&#xff0c;vit_h新的数据集&#xff…

使用人工智能助手 Github Copilot 进行编程 01

本章涵盖了 AI 助⼿如何改变新程序员的学习⽅式为什么编程永远不会再⼀样了AI 助⼿如 Copilot 的⼯作原理Copilot 如何解决⼊⻔级编程问题AI 辅助编程的潜在危险 在本章中&#xff0c;我们将讨论人类如何与计算机进行交流。我们将向您介绍您的 AI 助手 GitHub Copilot&#x…

Git 基本命令与操作流

记录 Git 中的基本命令和创建仓库、提交文件、删除文件等方面的操作 Git 基本命令 git status&#xff1a;查看状态 nothing to commit, working directory clean&#xff1a;所有已跟踪文件在上次提交后都未被更改过&#xff0c;或者说当前目录下没有出现任何处于未跟踪状态…

一篇文章带你彻底了解flex布局

哈喽&#xff0c;大家好呀&#xff0c;我是前端理想哥&#xff0c;今天我们来聊聊 flex 布局。 好&#xff0c;主角登场。 CSS 弹性盒子模型( Flexible Box 或者 Flexbox ) 先来看看它的定义&#xff1a;弹性布局是指通过调整其内元素的宽高&#xff0c;从而在任何显示设备上…

Conmi的正确答案——eclipse C/C++显示“未解析的包含:<xxx.h>”/“Unresolved inclusion: <xxx.h>”

eclipse IDE 版本&#xff1a;2023-12 部分采自&#xff1a;解决方法&#xff1a;关于问题 “C - Unresolved inclusion: <iostream>” 解释事项&#xff1a;方法一可能版本不同&#xff0c;部分界面修改了。这里使用的是方法二的解决方法。&#xff08;或者各位大神的描…

Dubbo使用详解

简介 Dubbo是一个高性能、轻量级的开源Java RPC框架&#xff0c;由阿里巴巴公司开发并开源。它提供了三大核心能力&#xff1a;面向接口的远程方法调用&#xff0c;智能容错和负载均衡&#xff0c;以及服务自动注册和发现。Dubbo使得应用可通过高性能的 RPC 实现服务的输出和输…

ITSS内幕揭秘!不看后悔!

1️⃣ ITSS&#xff1f;那是啥玩意&#xff1f; ITSS&#xff0c;就是一套超酷的信息技术服务标准大全&#xff01;它规范了所有信息技术服务的小秘密&#xff0c;确保服务可靠又让人放心&#xff01;&#x1f4aa; 2️⃣ 哪些公司需要这个神器&#xff1f; ITSS可是个大家伙&a…

Unity 程序员UI编码规范

今天给大家分享Unity UI开发相关的一些编码和规范&#xff0c;有了这些指导规范&#xff0c;帮助你的项目获得更好的性能&#xff0c;少走弯路。Unity GUI&#xff08;也被称为UGUI&#xff09;经常是项目性能问题的来源。 考虑使用多分辨率和宽高比 大部分情况下&#xff0c…

解锁文字魔法:探索自然语言处理的秘密——从技术揭秘到应用实战!

目录 前言 关键技术——揭密自然语言处理的秘密武器&#xff01; 领域应用——自然语言处理技术在不同领域的奇妙表演&#xff01; 超越极限——自然语言处理技术面临的顽强挑战揭秘&#xff01; 科技VS伦理——自然语言处理技术的发展与伦理社会的纠结较量&#xff01; 开…