C语言关键字 数据类型 格式符 修饰符 运算符一览

关键字

粗体表示C90
斜体表示C99
粗体加斜体表示C11

autoexternshortwhile
breakfloatsigned_Alignas
caseforsizeof_Alignof
chargotostatic_Bool
constifstruct_Complex
continueinlineswitch_Generic
defaultinttypedef_Imaginary
dolongunion_Noreturn
doubleregisterunsigned_Static_assert
elserestrictvoid#_Thread_local
enumreturnvolatile

数据类型关键字

K&RANSI / C90C99
intsigned_Bool
longvoid_Complex
short_Imaginary
unsigned
char
float
double

输出格式符、修饰符 printf

输出格式符 conversion specifier

直译应该是转换说明符

输出格式符 ANSI C数据类型
%e %E浮点数科学计数法表示,如1e10 1E10
%f浮点数十进制表示
%g %G浮点数如果指数部分大于4或者小于-4,则使用%e表示,否则使用%f表示
%d %i有符号十进制整数
%u无符号十进制整数
%o无符号八进制整数
%x %X无符号十六进制整数
%p指针的十六进制地址
%a %A(C99/C11)表示十六进制浮点数,10.0输出0x1.4p+3 查看更多
%c单个字符
%s字符串
%%打印字符%

输出格式符修饰符 modifier

输出格式符修饰符意义
*类似于digits的功能,使用的时候需要搭配参数 查看更多
+非负数带正号,负数带负号
-在定义了域宽时使输出左对齐
空格非负数带空格,负数带负号
#%#o显示八进制数前缀0
%#x显示十六进制前缀0x
浮点数显示小数点
%#g显示小数点后的0 如0.1->0.100000 0.00001->1.00000e-05
0定义了域宽时填充0
若已经有负号的flag修饰符或给整数定义了精度则会被忽略
digit(s)最小域宽,如%3d,12输出则为_12 (这里用_表示1个空格)
.digit(s)精度,对于%e和%E表示小数点后数字的个数
对于%g和%G表示符号位的最大位数
对于%s表示打印字符的个数
对于整数表示最少出现的数字,不足则补0
只使用 . 时默认 . 之后为0,如 .f 表示 .0f
L修饰浮点数格式符,指定输出一个long double浮点数
h修饰整数格式符,指定输出一个short或unsigned short整数
hh修饰整数格式符,指定输出一个char或unsigned char整数
l修饰整数格式符,指定输出一个long int或unsigned long int整数
ll(C99)修饰整数格式符,指定输出一个long long int或unsigned long long int整数
j修饰整数格式符,指定输出intmax_t或uintmax_t类型的整数,这些类型定义在stdint.h中
t(C99)修饰整数格式符,指定输出一个ptrdiff_t类型的整数,这个类型用于对比两个指针的不同
z(C99)修饰整数格式符,指定输出一个size_t整数,这个类型由sizeof返回

输入格式符、修饰符 scanf

输入格式符

输入格式符与输出格式符不同的就是浮点数
float类型使用%f %e %E %g %G %a %A
double类型需要加上格式符修饰符 l (L小写)

除此之外需要注意的是字符串格式符%s,scanf会读取第一个非空字符到下一个非空字符之间的所有字符

输入格式符修饰符

输入格式符修饰符意义
*抑制分配,或者说跳过该输入项 查看更多
digit(s)最大域宽,在达到最大域宽或遇到空白符时停止输入
hh读取一个char或unsigned char
如%hhd、%hhu
ll读取一个long long或unsigned long long
如%lld、%llu
h l L%hd和%hi表示读取一个short int
%ho、%hx和%hu表示读取一个unsigned short int
%ld和%li表示读取一个long
%lo、%lx和%lu表示读取一个unsigned long
%le、%lf和%lg表示读取一个double
%Le、%Lf和%Lg表示读取一个long double
如果没有使用这些修饰符%d %i %o %x表示int,%e、%f和%g表示float
j(C99)当修饰一个整数格式符时表示使用intmax_t或uintmax_t类型
z(C99)当修饰一个整数格式符时表示使用sizeof的返回类型
t(C99)当修饰一个整数格式符时表示使用ptrdiff_t类型

运算符

其他补充

关于数据类型关键字

C语言中各种数据类型是由各种关键字组合而成
在学习时只需要理解基础类型,其他的也就很容易理解
比如整型int,衍生出short int, long int, long long int, unsigned short int, unsigned int, unsigned long int, unsigned long long int

归根结底计算机底层只有两种类型:整型和实型
之所以会有这么多的类型,一方面是取值范围不同(int 和 long),一方面是功能需要(char、_Bool等)

格式符是什么

对于一个二进制值01001100,使用%d可以输出76,使用%x可以输出4c,使用%c可以输出‘L’
你我可以将其理解为翻译/解释符,%c意味着将数值翻译/解释成一个字符,printf就会在对应的内存空间中读取一个字节的数据

float没有输出格式符

double有%f %e,long double有%Lf %Le,而float没有

这是历史缘故,在K&R C时,float数据在被使用之前,不管是在表达式或者是作为实参,都会被自动转换成double类型
尽管ANSI C之后没有不再要求进行自动转换,为了不改动大量已有代码,这一功能被保留下来,因此,没有必要为float加一个格式转换符

而这衍生出一个问题:就是float和double的速度谁比较快?
直观而言,float需要经过一次转换才能进行计算,最后还要转换回float,而double直接参与计算,看起来是double比较快
实际上,这没有确切的答案。在有些机器上有专门的硬件处理浮点运算,有的可以直接计算float,double需要转换,有的则是可以直接计算double,float需要转换,在图形运算中进行矢量运算时,float比double快

*格式符修饰符

对于printf,它用于指定域宽或精度,需要搭配参数来使用,如

float val = 242.5;
unsigned int width = 8, precision = 3;
printf("_%*.*f_", width, precision, val);
//输出_ 242.500_

对于scanf,它用于跳过输入项,例如

int n;
scanf("%*d %*d %d", &n);
//输入2020 2021 2022后,n=2022

scanf格式字符串中的空白符

空白符指的是空格、tab、换行符
scanf的第一个参数,字符串,这里称之为格式字符串
格式字符串中的空白符表示跳过下一个输入项前的任何空白符,也可以没有空白符
如scanf(“%d ,%d”, &n, &m)可接收的输入为

  • 1,1
  • 1 ,1
  • 1     ,1
  • 1     ,    1

对于%c也会生效

关于sizeof_t和%zd

关于sizeof返回值的类型,C的标准只要求其是一个无符号整数,这就意味着在不同的系统上,你可能需要使用不同的格式符%u %lu %llu

为了代码的可移植性,C在stddef.h(stdio.h已经include了它)中提供了size_t类型,对应你系统sizeof使用的类型,是一种底层类型underlying type,由typedef关键字实现,与机器相关,而使用z修饰符时printf会根据对应的类型打印出来。
ptrdiff_t类型也是一种底层类型。

十六进制浮点常量 Hexademical Floating-Point Constant

十六进制的浮点数,比 十进制浮点数表示法 能更加精确地表示 二进制浮点数(计算机实际存放的数据格式),下面是例子:

0x1.999999999999ap-4是一个最近似于十进制数0.1的十六进制双精度浮点数

它由4个部分组成

  • 0x代表它是一个十六进制数
  • 1的位置是一个二进制位,这个位置要么是1要么是0,是二进制数的一个切片
  • 999999999999a这13位是十六进制的部分,表示剩余的52位二进制数
  • p-4后缀表示的是2的指数,等同于2^-4

将其展开为二进制浮点数,则是
1.100110011001100110011001100110011001100110011001101 x 2^-4

参考资料

《C Primer Plus 6th》英文版
博客: 关于十六进制浮点数的描述 – 英文

后记

本文将C语言中的关键字、数据类型关键字、输入输出格式符、格式符修饰符列表整理在一起,方便查阅,同时增加了一些补充方便理解
文章暂且到这里,之后有需要再补充,也欢迎各位指正
文章内容主要是翻译而来,CSDN博客选择翻译类型要求获得原作者授权,我上哪去找Stephen Prata,这不是刁难我胖虎吗/震怒

  • 12
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值