(C/C++)数据结构所需的程序语言基础(一)数据类型、运算符及表达式

本文介绍了C/C++编程的基础知识,涵盖数据的表现形式,包括常量、变量、标识符、常变量及其区别。深入讲解了数据类型,如整型、字符型和浮点数类型,以及它们的使用方法和取值范围。此外,还探讨了运算符和表达式,包括算术运算符、赋值运算符、比较运算符、逻辑运算符和强制类型转换运算符的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语言基础之数据类型、运算符及表达式

(一)数据及数据的表现形式

1. 数据

        是描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合,数据不仅仅指我们通常所说的数值类型,还包括字符及声音,图像,视频等非数值类型。

2. 数据的表现形式

  1. 常量        -----其值在运行过程不能改变的量
  2. 变量        -----用来存放变量,即变量的值
  3. 常变量     -----其值不能改变的变量
  4. 标识符     -----给对象取名字
2.1 常量

在程序运行过程中,其值不能被改变的量。

常量一般出现在表达式或赋值语句中。

常量的分类

整形常量100,123,-3等
实型常量123.4,3.14,0.345等
字符常量‘1’,‘a’,'\n’等
字符串常量“123” ," abc"等
符号常量如#define PI 3.14
常量的几点注意事项

        ①字符常量有且仅包括一个字符,且用单引号’ '表示。

        ②字符串常量可以包括全部字符,用双引号" "表示。

        ③转义字符是以’\ '开头的特殊的字符序列,常用的总结如下:

\\表示反斜杠
\n表示换行符
\r表示回车
\t表示制表符
2.2 标识符

1.定义

用来给变量、符号常量、函数、数组、类型等命名的有效字符序列。

2.命名规范

        ①只能由字母、数字、下划线三种符号组成。

        ②必须以字母或者下划线开头。

        ③不能使用关键字。(如int是整形变量的关键字)

2.3 变量
  1. 在运行过程中其值可以被改变。

  2. 变量必须先定义后使用。

int b =2;	//变量的初始化
b=2;	//报错,变量a没有定义

//
3. 变量定义的格式。

        数据类型 变量名 = 变量值

        例如定义一个整型变量sum, int sum = 0;

  1. 变量的实质。

以int b=2 为例,
在这里插入图片描述
5.变量的特点

        ①变量在编译时系统会给其分配相应的内存空间。

        ②可以通过变量名或者地址访问内存空间。

2.4 常变量
  1. 定义

        运行期间其值不会改变的变量。

  1. 格式

        const 数据类型 变量名 = 变量值

        如const int a = 3;

注意事项:

  1. 符号常量变量的区别

        ①符号常量是不占内存的,只是一个临时符号,预编译完成后就消失了。

        ②符号常量用大写表示。

  1. 常变量常量的异同

        ①常变量具有变量的基本属性,即有类型、占存储单元。

        ②不允许改变其值。

2.5 进制(补充)
  1. 定义

        进制就是一种进位方法,对于任意X进制就表示某一位置上进行运算时是逢X进一。十进制是逢10进一,十六进制是逢16进一,二进制就是逢二进一,简而言之,X进制就是逢X进一。

  1. 其他进制转10进制。

两点注意项: 左边是高位,右边是低位。按权展开即可。

举例:

二进制1010转化为10进制是多少?

0* 2 0 2^0 20+1* 2 1 2^1 21+0* 2 2 2^2 22+1* 2 3 2^3 23 = 10

八进制1010转化为10进制是多少?

0* 8 0 8^0 80+1* 8 1 8^1 81+0* 2 2 2^2 22+1* 8 3 8^3 83 = 520

十六进制1010转化为10进制是多少?

0* 1 6 0 16^0 160+1* 1 6 1 16^1 161+0* 1 6 2 16^2 162+1* 1 6 3 16^3 163 = 4112

  1. 10进制转其他进制。

        方法:用10进制数除以X(X进制),分别取余数和商,商为0时,将余数倒着数就是转化以后的结果。

        举例:将10进制数17,转化为二进制数、八进制数和16进制数分别是多少?

        二进制10001

         17÷2=8余1 取商8÷2=4余0 取商4÷2=2余0 取商2÷2=1余0 取商1÷2=0余1

        结果为倒着取余数,所以结果是10001

        八进制21

        17÷8=2余1 取商2÷8=0余2
        结果为倒着取余数,所以结果是21

        十六进制11

        17÷16=1余1 取商1÷16=0余1

        结果为倒着取余数,所以结果是11

  1. 二进制、八进制、十六进制的相互转化

        二进制转八进制 (从右往左分,八进制一位对应二进制3位)

        1010101111011

        101 010 111 011 //52173

  1. 八进制转二进制

        1234 //001 010 011 100

        即001010011100

  1. 二进制转16进制 (从右往左分,十六进制一位对应二进制4位)

        1010111010010000
        1010 1110 1001 0000 //AE90

        (十六进制0-9后用A(10)BCDEF(15)表示)

  1. 16进制转二进制

        A87 //1010 1000 0111

        即101010000111

相应的进制在C语言中的表示

十进制以正常数字1-9开头,如15
八进制以数字0开头,如015
十六进制以数字0开头,如015
二进制C语言不能直接书写二进制数

在这里插入图片描述

2.6 计算机数值存储方式(补充)
  1. 原码

        ①一个数的原码是原始的二进制码。

        ②最高位是符号位,0表示正,1表示负。

        ③数值位就是数值本身的绝对值的二进制数。

        ④负数的原码是在绝对值的基础上,最高位为1.

下面以1个字节进行说明:

十进制数原码
+130000 1101
-131000 1101
+00000 0000
-01000 0000

不难发现:使用原码存储数据会产生两个问题:

        ①数值0有两种表示方法。.

        ②正数和负数相加,结果不正确(计算机只会加法,减法的实质就是加法)。

例如使用原码计算1-1,结果如下:

        1      0000 0001

        -1     1000 0001

        1-1=1+(-1)=00000010000001=-2 //结果不正确

  1. 反码

        ①对于正数,反码和原码相同。

        ②对于负数,符号位不变,其他部分按位取反。

下面以1个字节进行说明:

十进制数反码
+130000 1101
-131111 0010
+00000 0000
-01111 1111

注意:使用反码存储数据会产生1个问题:

②数值0有两种表示方法。

反码解决了正数和负数相加的问题:

如1-1,使用反码

1      0000 0001
-1     1111 1110
1-1=1+(-1)=00000001+11111110= 11111111=-0=0

  1. 补码

        ①计算机中存储数据都是补码形式,为了解决负数存储问题。

        ②对于正数,原码、补码、反码都相同。

        ③对于负数,其补码为其反码加1。

        ④补码符号位不变,其他位求反,最后整个数加1,得到原码。

        有符号整数的范围是 -128 ~ +127;另外(有符号整数)1000 0000被人为规定为 -128的补码。

对负数求补码:就是将该数的绝对值的二进制形式,按位取反再+1

十进制数补码
+130000 1101
-131111 0011
+00000 0000
-00000 0000

计算机使用补码存储的意义;

        ①统一了0的编码。

        ②将减法运算变为加法运算。

        ③两个用补码表示的数相加时,如果最高位有进位,则进位被舍弃。

计算机补码的使用实践

#include <stdio.h>
int main()
{
//如果使用二进制、八进制、十六进制,即为补码表示。
	char a = 0x85;
	printf(" a=%d\n ",a); //补码转原码
//如果用10进制表示,即站在用户的角度,原码表示。
	char b = -15;
	printf("b=%x\n", b); //原码转补码
	return 0;
}

//char型一个字节,0x85在计算机中以补码表示即1000 0101(转原码)–>1111 1010–>(加1)1111 1011(即-123)

//-15即1000 1111–>1111 0000–>1111 0001

a=-123
b=fffffff1

sizeof运算符的使用

sizeof不是函数,所以不需要包括任何头文件,它的功能是计算一个数据类型的大小,单位为字节。

sizeof的返回值为size_t。

size_t类型在32位操作系统下是unsigned int,是一个无符号整数。

#include <stdio.h>
int main()
{
//这里数据类型的作用,其实就是告诉编译器定义
//此类型的变量需要多大的内存空间。
	int a = sizeof(int);
	printf("sizeof (char) = %u\n",sizeof (char));
	printf("sizeof(int) = %u\n",sizeof(int));
	printf("sizeof(int) = %u\n",a);
	return 0;
}

sizeof(char) = 1
sizeof(int) = 4
sizeof(int) = 4

(二)数据类型

1. C语言数据类型分类

1. 基本数据类型

        ①整型类型

        ②浮点类型

2. 枚举类型

3. 空类型

4. 派生类型

        ①指针类型

        ②数组类型

        ③结构体类型

        ④共用体类型

        ⑤函数类型

1.1 整型类型的分类
  1. 基本整型(int型)

        ①占2个或者4个字节,由编译系统决定。

        ②以整数的补码形式存放。

  1. 短整型(short int)

        以VisualC++为例,占2个字节。

  1. 长整型(long int)

        以VisualC++为例,占4个字节。

  1. 双长整型(long long int)

        以VisualC++为例,占8个字节。

1.2 整型类型的基本用法

常用的打印格式

打印格式含义
%hd输出short 类型
%d输出int类型
%l输出long类型
%ll输出long long类型
%hu输出unsigned short类型
%u输出unsigned int类型
%lu输出unsigned long类型
%llu输出unsigned long long类型
C语言程序示例
#include <stdio.h>
int main()
{
	int a =12;
	short int b = 2;
	long int c =3451;
	printf("a=%d\n",a);
	printf("b=%hd\n",b);
	printf("c=%ld\n",c);
}

a=12
b=2
c=3451

注意:

类型长度long > int > short

小的数据类型赋值给大的数据类型,系统会自动转换。大的数据类型赋值给小的数据类型会损失高位。

有符号与无符号的区别

有符号数最高位表示符号位,0为正数,1为负数。

无符号数最高位是数值位,只能表示正数。

具体应用如下:

#include <stdio.h>
int main()
{
//定义一个有符号数0x80000001
	printf("%d\n", 0x800000f4); 
	printf("%u\n",0x800000f4);
	signed int a= -12; //等价于int a=-12;
	unsigned int b = 12; //只能表示正数
	unsigned int c = 0x800000f4;
	printf("c=%d\n",c); //输出结果以%d为准
	printf("c=%u\n",c); //输出结果以%u为准
	return 0;
}

输出结果:
-2147483404
2147483892
c=-2147483404
c=2147483892

有符号整教与无符号整教的取值范围

数据类型占用空间取值范围
short2字节-32768到32767 (- 2^15 ~ 2^15 -1)
int4字节-2147483648到2147483647 (-2^31 ~ 2^31-1)
long4字节-2147483648到2147483647 (-2^32 ~ 2^32-1)
unsigned short2字节0到65535(0 ~ 2^16 -1)
unsigned int4字节0到4294967295 (0 ~ 2^32 -1)
unsigned long4字节型0到4294967295 (0 ~ 2^32 -1)
1.3 字符型数据
  1. 内存中没有字符,只有数字,存放字符实际上存放的是其ASCII码(即一个字符对应
    一个数字的一张表)。

  2. 使用字符赋值和使用ASCII码赋值作用是一样的。

  3. 字符类型的实质就是一个字节的整数。

  4. 字符的使用示例:

#include <stdio.h>
int main()
{
	char ch = 'a';//定义字符a
	char b = 97;//和使用字符赋值是等效的
	printf("ch=%c\n",ch);//输出字符a
	printf("ch=%d\n",ch);//输出字符a对应得ascii码
	printf("b=%c\n",b);//输出字符a
	return 0;
}

ch=a
ch=97
b=a

练习:大小写字母转换

解题关键:小写字母与大写字母之差为32。

程序示例:

#include <stdio.h>
int main()
{
	char ch = 'a';//定义字符a
	char ch2 ='A';
	printf("ch=%c\n",ch-32);//小写转大写
	printf("ch=%c\n",ch2+32);//大写转小写
	
	return 0;
}

ch=A
ch=a

转义字符

  1. 以 / 开头的特殊字符序列,原则上字符’ '里面只能有一个字符,但转义字符除外。

  2. 常见的转文字符为 \t(制表符),\n(换行符)

  3. 程序示例:

#include <stdio.h>
int main()
{
    char ch = '\t';
    char ch2 = '\n';
    printf("abedef\n");
    printf("abf%cdef\n",ch);
    printf("abc");//因为没有换行符\n所以打印结果与下一行打印结果在同一行
    printf("abc%c",ch2);
    printf("这有一个换行符");
}

abedef
abf def
abcabc
这有一个换行符

char类型的范围

  1. 取值范围如下(从用户的角度分析):
数据类型占用空间取值范围
char1字节-128 ~ 127 (- 2^7 ~ 2^7-1)
unsigned char1字节0到255(0 ~ 2^8 -1)
  1. 赋值时一定要注意不要超过取值范围。
    代码示例:
#include <stdio.h>
int main()
{
	char ch = 127+1;
	unsigned char ch2 = 255+1;//0
	printf("ch=%d\n",ch); //-128
	printf("ch2=%d\n",ch2);
}

ch=-128
ch2=0
main.c: In function ‘main’:
main.c:4:21: warning: unsigned conversion from ‘int’ to ‘unsigned char’ changes value from ‘256’ to ‘0’ [-Woverflow]
赋值越界。
(菜鸟在线编译环境)
https://c.runoob.com/compile/11

1.4 浮点数类型数据

        浮点型的作用是用来存储小数的,常见的主要是两种,单精度浮点型float双精度浮点型double 其中,double所表示的浮点数比float要更准确。

数据类型占用空闻有效数字范围
float4字节6位有效数字
double8字节15位有效数字

程序示例:

#include <stdio.h>
int main()
{
	float a =100.9f; //带f表示是float型
	double b = 3.14; //不带f的是double型
	printf("a=%f\n",a);
	printf("b=%lf\n",b);
	return 0;
}

a=100.900002
b=3.140000

1.5 字符串常量

字符串是内存中一段连续的 char空间,以’\0’(数字0)结尾。

字符串常量是由双引号括起来的字符序列,如"abe" ," love"等。

字符常量字符串常量的区别:

每个字符串的结尾,编译器会自动的添加一个结束标志位”\0’,即"a" 包含两个字符
‘a’和’\0’。
在这里插入图片描述

1.6 字符串输出之printf函数

定义格式。

printf(格式控制,输出表列)。

程序示例:

#include <stdio.h>
int main()
{
	int a =10;
	double b = 3.14;
	printf("country=%s\n","china");//输出字符串
	printf("%%\n");//输出一个百分号。
	//%3d表示输出共有3个字符,不足则用空格补,默认右对齐
	printf(" a=%3d\n",a);
	//-表示左对齐
	printf(" a=%-3d\n",a);
	printf(" b=%1f\n",b); 
	//m.n,m表示共有多少位,n表示保留多少个小数位
	printf("b=%6.21f\n",b);
}

country=china
%
a= 10
a=10
b=3.140000
b=3.140000000000000124345

1.7 字符串输入之scanf函数

定义格式。

scanf(格式控制,地址表列)。

程序示例:

#include <stdio.h>
int main()
{
	int age;
	printf("请输入年龄:");
	scanf ("%d",&age);
	printf("age=%d\n",age);
return 0;
}

请输入年龄:18
age=18

字符输入输出函数

定义格式。

putchar( c )

getchar( c )

程序示例:

#include <stdio.h>
int main()
{
	char ch;
	printf("请输入性别:");
	ch = getchar();
	putchar(ch);
	//putchar('\n');
	return 0;
}

(三)运算符与表达式

1. 运算符

常用运算符的分类

运算符类型作用
算术运算符用于处理四则运算
赋值运算符用于将表达式的值赋给变量
比较运算符用于表达式的比较,并返回一个真值或假值
逻辑运算符用于根据表达式的值返回真值或假值
位运算符用于处理数据的位运算
sizeof运算符用于求字节数长度
1.1 算数运算符

1.基本运算符

+、-、*、/、%

5/2 //?如果要得到正确的值怎么做?

程序示例:

#include<stdio.h>
int main()
{
	int a = 5;
	int b = 2;
	int c = a/b;
	printf("c=%d\n",c);
	return 0;
}

结果:2

2.自增或者自减运算符

++i、 i++、 --i、 i–

a=3

b= ++a //a=?b=?

b=a++ //a=?,b=?

思考: a++; b=a; a?,b?

#include<stdio.h>
int main()
{	
	int a =3;
	int b =0;
	//前置++(先将a的值加1,在使用)
	b = ++a;
	printf("a=%d,b=%d\n",a,b);
	//后置++(先使用a的值,在加1)
	a = 3;
	b = 0;
	b = a++;
	printf("a=%d,b=%d\n",a,b); 
	return 0;
}

结果:
a=4,b=4
a=4, b=3

1.2 赋值运算符
运算符术语示例结果
=赋值a=2; b=1;a=2; b=1;
+=加等于a=0; a+=1;a=1;
-=减等于a=5; a-=2;a=3;
*=乘等于a=3; a=2;*a=6;
/=除等于a=6; a/=3;a=2;
%=模等于a=3; a%2;a=1;
1.3 比较运算符

1.在C语言比较运算符中,真用数字1表示假,用数字0表示。

运算符术语示例结果
==相等于4==20
!=不等于4!=21
<小于4<20;

| 大于|4>2 | 1
<= | 小于等于|4<=2 |0
= | 大于等于|4>=2 |1
2.程序示例

#include<stdio.h>
int main(){
	printf("4==3的结果为:%d\n",4==3);
	printf("4!=3的结果为:%d\n",4!=3);
	return 0;
}
1.4 逻辑运算符
运算符术语示例结果
!!a如果a为假,则a为真:如果a为真,则!a为假
&&a&&b如果a和b都为真,则结果为真,否则为假。
IIa II b如果a和b有一个为真,则结果为真,二者都为假时,结果为假.
1.5 运算符优先级

同一优先级的运算符,结合次序由结合方向所决定。

简单记就是: ! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

1.6 强制类型转换运算符
  1. 一般形式

        (类型名)表达式

        float a=7.5,int b=3;

        int c =a/b //?是否正确

  1. 缺点

        损失精度

  1. 规则

        小类型到大类型的转换是自动的。

        大类型到小类型的转换需要强制转换。

在这里插入图片描述

练习

unsigned short a =65535;
short b = a;

执行上述程序段后,b 的值是

A. -1 B. -32767 C. -32768 D. -65535

自学自用,难免存在错误,如有错误,请给予指正。在这里将自己的心得和学习过程分享给大家,为大家提供一些思路,希望大家在学习的道路上少走一些弯路。

部分资源来源于网络,如有侵权,请联系本人予以删除!

### OpenGauss 数据库基础知识 #### 什么是 OpenGaussOpenGauss 是一款开源的关系型数据库管理系统,由华为公司主导开发并开放源代码。它基于 PostgreSQL 并进行了大量优化和增强,适用于企业级应用环境中的高并发、高性能需求场景[^1]。 #### 初步认识 OpenGauss 的核心功能 以下是 OpenGauss 提供的一些主要功能模块及其用途: - **数据库管理工具 gsql** `gsql` 是 OpenGauss 自带的一个命令行客户端工具,用于连接到数据库实例执行 SQL 查询和其他操作。启动时会显示版本号以及当前的安全连接状态提示信息[^3]。 - **用户与权限管理** 默认情况下,在安装完成后仅有一个具有超级管理员角色的账户可用(通常名为 gaussdb 或类似的名称)。为了满足多租户的需求或者更细粒度控制资源分配情况,则需要额外创建新的普通用户账号,并赋予相应的访问权限范围。 - **SQL 支持概况** OpenGauss 遵循标准 ANSI/ISO SQL 规范的同时也扩展了一些专有的特性来提升性能表现力。主要包括但不限于以下几个方面: - 数据定义语言(DDL): 如前所述涵盖了模式(schema), 表(table),视图(view) 和索引(index) 等实体类型的增删改动作支持; - 数据操纵语言(DML): 插入(insert)/更新(update)/删除(delete) 记录等常规事务处理指令集; - 条件判断表达式(case when then else end); - 子查询嵌套结构等等复杂逻辑实现方式[^4]. #### 实践指南:如何开始使用 OpenGauss? 假设已经成功部署好了一个单节点版的服务端程序之后,下面简单列举几个常见的初始化配置步骤作为参考: ```bash # 启动服务进程 $ gs_ctl start -D /path/to/data/directory/ # 登陆进入交互界面测试连通性状况 $ gsql -d postgres -U your_admin_username -W password_here ``` 接着就可以按照官方文档指引逐步探索更多高级特性和最佳实践案例了! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值