使用 Visual Studio 2019 【在更】基础 | C 语言笔记( 四 )


注:若使用 cpp 文件编译则编译失败 。
例如:“CHINA” 在内存中的存储结果 , 占用 16 字节
2.8 混合运算
“运算”包括数学运算与赋值运算 。
不同类型的数据先要转换为同一类型再进行运算 , 不同类型的转换级别如下:
从短字节到长字节的类型转换是由系统自动进行的 , 编译时不会给出警告;若反向进行 , 则编译时编译器会给出警告 。
注:在保证数据内容不会因长字节向短字节转换时产生截断而导致数据丢失时 , 可以使用强制转换 , 即在变量前插入 (数据类型) , 编译不会发出警告 。
2.8.1 数值按 int 型(4 个字节)运算
例:两个较大整型常量相乘溢出
解析:
在 ("%lld\n", *) 中直接输出方法相同 。
注:在 64位操作系统下 , long 型占 8 字节 , 使用 long 型输出即可 。虽然但是我用x64编译没有成功过也不知道为啥 … … (挠头 \{}{虽然但是我用 x64 编译没有成功过也不知道为啥……(挠头} 虽然但是我用x64编译没有成功过也不知道为啥……(挠头?
2.8.2 浮点型常量默认按型(8 个字节)运算
例:加法运算
输出:
解析:
例:除法运算
输出:
注:赋值给 float 型变量的常数需要带小数部分 , 否则编译器默认变量为 int 型运算 。
2.9 常用的数据输入/输出函数
标准输入函数:scanf、 。
标准输出函数:、 。
2.9.1 scanf 函数的原理
当一个进程启动时 , 内存中的内核区域(详见 2.2 常量 → 内存)开放系统调用 。键盘输入被写入标准输入缓冲区 , scanf 函数从标准输入缓冲区中读取输入 。
系统调用:内核在每个进程开启时为其维护三个缓冲区(即三块内存) , 由高地址向低地址分别为:标准输入缓冲区、标准输出缓冲区、标准错误输出缓冲区 , 大小分别为 4k 。
当 scanf 读取的缓冲区中没有数据时会产生阻塞 , scanf 进入睡眠(CPU 占用率为 0%) , 在完成输入并键入回车后 scanf 才继续运行 。
缓冲区原理:
缓冲区是一段内存空间 , 分为读缓冲和写缓冲 。C 语言缓冲的三种特性如下:
全缓冲:当填满标准 I/O 缓存后才进行实际 I/O 操作 。
典型代表:对磁盘文件的读写操作 。行缓冲:当在输入和输出中遇到换行符时 , 将执行真正的 I/O 操作 。这时 , 我们输入的字符先存放到缓冲区中 , 等按下回车键换行时才进行实际的 I/O 操作 。典型代表:标准输入缓冲区(stdin)和标准输出缓冲区() 。不带缓冲:即不进行缓冲 。
典型代表:标准出错情况() , 这使得出错信息可以直接尽快地显示出来 。
scanf 函数:
# include int scanf(const char *format, ...);//scanf(字符型常量格式, 存储地址);//scanf_s(字符型常量格式, 存储地址, 读取字符长度);
例:使用 scanf 时 %d 与 %c 的区别(& 为取址符 , * 为指针)
输出(输入 123):
取消 8-9 行注释
输出(仅输入一串 123):
注:由于使用 scanf 编译失败 , 报错说明 C4996 提示将 scanf 更改为。二者的不同点在于 scanf 函数不会进行边界检查 , 可能造成数据溢出 , 为已弃用的函数;
在调用时需提供一个数字表明最多读取多少位字符 , 因而能够进行边界检查 。在使用替代 scanf 后 , 第 10 行发出警告 , 只需将其更改为 ("%c", &c, (c)); 即可 。