随笔 - 5  文章 - 0  评论 - 0  阅读 - 1753

【二】数据类型、运算符与表达式

【二】数据类型、运算符与表达式

学习目标

  • 数据类型
  • 常量与变量的差异
  • 整型、浮点型、字符型的原理及应用
  • scanf函数的原理及应用
  • 运算符与表达式

2.1 数据类型

  数据类型的分类如下

 

  C语言中的关键字

auto const double float int short struct unsigned
break continue else for long signed switch void
case default enum goto register sizeof typedef volatile
char do extern if return static union while

2.2 常量

   常量是指在程序运行过程中,其值不发生变化的量。常量又可分为整型、实型(也称浮点型)、字符和字符串型。

   整型常量、实型常量、字符型常量是在编译时可以直接编入代码段的常量;字符串型常量是指存放在字符串型常量区中的常量。

【注】“”代表空串,即空的字符串

2.3 变量

  变量代表内存中具有特定属性的一个存储单元,它用来存放数据,即变量的值。这些值在程序的执行过程中是可以改变的。变量名实际上以一个名字代表一个对应的存储单元地址。编译、链接程序时,由编译系统为每个变量名分配对应的内存地址。从变量中取值实际上是通过变量名找到内存中存储单元的地址,并从该存储单元中读取数据。变量的命名规则:只能由字母、数字和下划线三种字符组成,并且第一个字符必须为字母或下划线。

【注】C语言区分大小写,&a表示取a的地址

 2.4 整型数据

2.4.1 符号常量

  define定义的内容是常量,符号常量不可以赋值

复制代码
#include <stdio.h>    //引用头文件
#define PI 3    //PI就是符号常量
int main()
{
    int a = 3;//a是一个变量
    a = 5;
    //PI = 10;//符号常量不可以赋值
    printf("%d\n", PI);
}
复制代码

2.4.2 整型常量的不同进制表示

  计算机中只能存储二进制数,即0和1,而在对应的物理硬件上则是高、低电平。为了方便地观察内存中二进制数情况,除正常使用的十进制外,计算机还提供了十六进制数和八进制数。关于进制及进制间的相互转化此处略。十进制0-9,八进制0-7,十六进制0-9,A-F。

  在计算机中,1字节为8位,1位即二进制的1位,它存储0或1,int型常量的大小为4字节,即32位。

  1kb = 1024字节

  1mb = 1024kb

  1Gb = 1024mb

2.4.3 整型变量

  int i,变量i是4个字节

2.5 浮点型数据

2.5.1 浮点型常量

  表示浮点型常量的形式有两种,如下表,其中e代表10的幂次,幂次可正可负。

 
小数形式 0.123
指数形式 3e-3(为3x10-3,即0.003)

【注】:字母e(或E)之前必须有数字,且e后面的指数必须为整数。

2.5.2 浮点型变量

  通过float来定义浮点变量,f占用4个字节的空间。

2.6 字符型数据

2.6.1 字符型变量

  用单引号括起来的一个字符是字符型常量,且只能包含一个字符。如,'a','A','1',' '是正确的字符型常量,而'abc',“a”,“ ”是错误的字符型常量。

  用“\”开头的特殊字符被称为转义字符,转义字符用来表示回车、退格等功能键。

转义字符 作用
\n 换行
\b 退格

\\

反斜杠

2.6.2 字符数据在内存中的存储形式及其使用方法

  字符型变量使用关键字char进行定义,一个字符型变量占用1字节大小的空间。一个字符常量存放到一个字符型变量中时,实际上并不是把该字符的字型放到内存中,而是把该字符的ASCII码值放到存储单元中,打印字符型变量时,若以字符形式打印,那么计算机会到ASCII码表中查找字符型变量的ASCII码值,查到对应的字符后会显示对应的字符,这样,字符型数据和整型数据之间就可以通用。字符型数据既可以以字符的形式输出,又可以以证书形式输出,还可以通过运算获取想要的葛洪字符。

  大小写字母转换,小写字母减去32可转为大写字母。

ASCII表

2.7 字符串型常量

  字符串型常量是由一对双引号括起来的字符序列,例如“How do you do”。在每个字符串型常量常量的结尾加一个字符串结束标志,以便系统据此判断字符串是否结束,C语言规定以字符'\0'作为字符串结束标志。

  字符串型常量“CHINA”在内存中存储结果如下

C H I N A \0

 

【注】:'a‘是字符型常量,而“a”是字符串型常量,二者不同。

    不可以将字符串型常量赋值给字符型常量。

2.8 混合运算

2.8.1 类型强制转换场景

  整型数进行除法运算时,如果运算结果为小数,那么存储浮点数一定要进行强制类型转换。

复制代码
#include <stdio.h>

int main()
{
    int i = 5;
    float j = i / 2;    //j输出2.000000
    float k = (float)i / 2;    //k输出2.500000
    printf("j=%f,k=%f\n", j,k);
}
复制代码

2.9 常用的数据输入/输出函数

2.9.1 scanf函数的原理

  C语言未提供输入/输出关键字,其输入和输出是通过标准函数库来实现的。C语言通过scanf函数读取键盘输入,键盘输入又称为标准输入,当scanf函数读取标准输入时,如果还没有输入任何内容,那么scanf函数会被卡主(专业用语为阻塞)。

  scanf读取的是标准输入,printf输出到控制台,输出到了标准输出。

复制代码
#include <stdio.h>

int main()
{
    int a,b;
    scanf("%d%d", &a,&b);//一定要在变量前加入&符号
    printf("a=%d,b=%d\n", a,b);
    printf("%d\n", a + b);
}
复制代码

 scanf使用方法

#include <stdio.h>
int scanf(const char * format,...);

  format是一个字符串,...是可变参数,参数的数目与format中的%的数目保持一致。%d,%f,%c可以混合使用,不限制出现次数。

%d 一个十进制整数
%f 一个浮点数
%c 一个单一的字符

缓冲区原理

  行缓冲:当在输入和输出中遇到换行符时,将执行真正的I/O操作。这时,我们输入的字符先存放到缓冲区中,等按下回车键换行时才进行实际的IO操作,典型代表是标准输入缓冲区(stdin)和标准输出缓冲区(stdout) .
  举例,向标准输入缓冲区中放入的字符为20\n',输入'\n'(回车)后,scanf 函数才开始匹配,scanf函数中的%d匹配整型数20,然后放入变量i中,接着进行打印输出,这时'\n'仍然在标准输入缓冲区(stdin)内,如果第二个scanf函数为scanf("%d",&i),那么依然会发生阻塞,因为scanf 函数在读取整型数、浮点数、字符串时,会忽略'\n'(回车符)、空格符等字符(忽略是指scanf函数执行时会首先删除这些字符,然后再阻塞) .,scanf函数匹配一个字符时,会在缓冲区删除对应的字符。因为在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'\n'。

复制代码
#include <stdio.h>

//缓冲区为空的时候,scanf才会阻塞
int main()
{
    int i;
    char c;
    float f;
    scanf("%d",&i);
    printf("i=%d\n",i);
    //scanf("%c",&c);
    //printf("c=%c\n", c);
    scanf("%f", &f);
    printf("f=%f\n", f);
}
复制代码

 2.9.2 scanf函数的循环读取

复制代码
#include <stdio.h>

int main()
{
    int i,ret;
    while (rewind(stdin),(ret=scanf("%d", &i))!=EOF)    //while是实现循环,后面要有一个小括号
    {
        printf("i=%d\n", i);
    }
    return 0;
}
复制代码

  scanf循环读取发生错误时返回EOF。代码中的rewind函数具有刷新标准输入缓冲区的作用。

2.9.3 多种数据类型混合输入

复制代码
#include <stdio.h>

//一个scanf读多种类型的数据
//混合输入时每次在%c之前需要加入一个空格
int main()
{
    int i;
    char c;
    float f;
    scanf("%d %c%f", &i, &c, &f);
    printf("i=%d,c=%c,f=%f\n", i, c, f);
    return 0;
}
复制代码

2.10 运算符与表达式

2.10.1 运算符分类

C语言提供了13种类型的运算符

(1)算术运算符(+ - * / %)

(2)关系运算符(> < == >= <= !=)

(3)逻辑运算符(! && ||)

(4)位运算符(<< >> ~| ^ &)

(5)赋值运算符(=及其扩展赋值运算符)

(6)条件运算符(?:)

(7)逗号运算符(,)

(8)指针运算符(*和&)

(9)求字节数运算符(sizeof)

(10)强制类型转换运算符((类型))

(11)分量运算符(.->)

(12)下标运算符([])

(13)其他(如函数调用运算符())

2.10.2 算术运算符及算数表达式

  算数运算符包含= - * / %,当一个表达式中同时出现这5种运算符时,先乘除取模,后进行加减。

int a = 4 + 5 * 2 - 6 / 3 + 11 % 4;

2.10.3 关系运算符与关系表达式

  关系运算符> < == >= <= !=依次为大于 小于 等于 大于等于 小于等于 不等于,由关系运算符组成的表达式称为关系表达式,关系表达式的值只有真和假,C语言认为一切非零值都是真。

2.10.4 逻辑运算符与逻辑表达式

!逻辑非 如果原来是真,取非就是假,如果是假,取非就是真

&& 逻辑与 a&&b,a和b任何一个为假,就是假,如果均为真,整体为真

|| 逻辑或 a||b,a和b任何一个为真,为真,如果均为假,整体才是假

逻辑运算符组成的式子叫逻辑表达式,逻辑表达式只有真和假,表达式的值存在于运算过程中

复制代码
#include <stdio.h>

//关系运算符和逻辑运算符
int main()
{      
    //printf("%d\n", 5 < 3);
    //printf("%d\n", 5 > 3);
    int a = 18;
    if (3 < a &&a < 10)    //要同时判断a>3和a<10要使用逻辑运算符
    {
        printf("a is right\n");
    else {
        printf("a is wrong\n");
    }
}
复制代码

2.10.5 赋值运算符

复制代码
#include <stdio.h>

//赋值运算符的左边只能放变量
int main()
{
    int a = 5;
    //a + 3 = 10;//如果爆出左操作数必须为左值的错误,这时说明等号左边必须是变量
    printf("a=%d\n", a);
}
复制代码

2.10.6 自增、自减运算符及求字节运算符

复制代码
#include <stdio.h>

//++i直接按优先级进行正常运算即可
int main()
{
    int i = -1;
    int j;
    j = i++ > -1;//后加加拆成两步j=i>-1;i++
    printf("i=%d,j=%d\n", i,j);//0 0
    printf("i的字节数=%d\n", sizeof(i));
}
复制代码

自增和自减不能用于常量

 

posted on   默默努力就好  阅读(283)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示