C
problems#
#problem
With MacOS 10.15.6 + VScode + Code ruuner extension
the sleep()
in C, pauses the stdio.h
.
and cannot answer getchar()
.
syntax#
storage classes#
auto register static extern : imported , external variables
pointer#
pointer(var type) is for saving Address
. like int is for saving numbers.
Address is the location of a variable in RAM.
*
varname->pointer: get the variable at the address of the pointer / define pointer
&
pointer->varname: get the address of the variable.
pointer of Array is like iterate, pointer++ can traverse the array.
main function#
returns 0:
The return value for main indicates how the program exited. Normal exit is represented by a 0 return value from main. Abnormal exit is signaled by a non-zero return, but there is no standard for how non-zero codes are interpreted. As noted by others, void main() is prohibited by the C++ standard and should not be used. The valid C++ main signatures are:
spaces#
space, tab, enter, comment /*comment*/
are all seen as spaces. So, int/*thing*/main()
this is legit.
constants (const)#
使用 #define
预处理器。使用 const
关键字。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。0xFeeL /* 合法的 */
printf#
转换说明符#
作为结果的打印输出
转换说明 | 输出 |
---|---|
%a | 浮点数、十六进制数字和 p-记数法 (C99) |
%A | 浮点数、十六进制数字和 P-记数法 (C99) |
%c | 一个字符 |
%d | 有符号十进制整数 |
%e | 浮点数、e-记数法 |
%E | 浮点数、E-记数法 |
%f | 浮点数,十进制记数法 |
%g | 根据数值不同自动选择%f 或者%e。%e 格式在指数小于-4 或者大于等于精度时使用 |
%G | 根据数值不同自动选择%f 或者%E。%E 格式在指数小于-4 或者大于等于精度时使用 |
%i | 有符号十进制整数 (与%d 相同) |
%o | 无符号八进制整数 |
%p | 指针(就是指地址) |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 使用十六进制数字 0f 的无符号十六进制整数 |
%X | 使用十六进制数字 0F 的无符号十六进制整数 |
%% | 打印一个百分号 |
修饰符#
五种标志 (-、+、空格、#和 0)都将在表三中描述,
修饰符 | 意义 标志 | 示例 |
---|---|---|
digit(s) | 字段宽度的最小值。 如果该字段不能容纳要打印的数或者字符串,系统会使用更宽的字段。 | M |
.digit(s) | 精度。对于%g 和%G 转换,是有效数字的最大位数。 | |
对于%e、%E 和%f 转换,是将要在小数点的右边打印的数字的位数。 | ||
对于%s 转换,是将要打印的字符的最大数目。 | ||
对于整数转换,是将要打印的数字的最小位数;如果必要,要使用前导零来达到这个位数。 | ||
.digit(s) | 只使用. 表示其后跟随一个零,所以%.f 与%.0f 相同。 |
%5.2f 打印一个浮点数,字段宽度为 5 个字符,小数点后有两个数字。 |
h | 和整数转换说明符一起使用,表示一个 short int 或者 unsigned short int 类型数值。 | %hu , %hx ,%6.4hd |
hh | 和整数转换说明符一起使用,表示一个 signed char 或者 unsigned char 类型数值。 | %hhu , %hhx ,%6.4hhd |
j | 和整数转换说明符一起使用,表示一个 intmax_t 或 uintmax_t 值。 | %jd ,%8jX |
l | 和整数说明符一起使用,表示一个 long int 或者 unsigned long int 类型值。 | %ld ,%8lu |
ll | 和整数说明符一起使用,表示一个 long long int 或 unsigned long long int 类型值 (C99)。 | %lld ,%8llu |
L | 和浮点转换说明符一起使用,表示一个 long double 值。 | %Lf ,.4Le |
t | 和整数转换说明符一起使用,表示一个 ptrdiff_t 值(与两个指针之间的差相对应的类型) (C99) | %td ,ti |
z | 和整数转换说明符一起使用,表示一个 size_t 值(sizeof 返回的类型) (C99)。 | %zd ,zx |
标志#
可以使用零个或多个标志
修饰符 | 意义 |
---|---|
- |
项目是左对齐的,也就是说,会把项目打印在字段的左侧开始处。示例:“%-20s” |
* |
有符号的值若为正,则显示带加号的符号;若为负,则带减号的符号。示例:“%+6.2f” |
(空格) |
有符号的值若为正,则显示时带前导空格(但是不显示符号);若为负,则带减号符号。+标志会覆盖空格标志。示例:“% 6.2f” |
# |
使用转换说明的可选形式。若为%o 格式,则以 0 开始;若为%x 和%X 格式,则以 0x 或 0X 开始,对于所有的浮点形式, |
# |
保证了即使不限任何数字,也打印一个小数点字符。对于%g 和%G 格式,它防止尾随零被删除。示例:“%#o”、“%#8.0f”和“%+#10.3E” |
0 |
对于所有的数字格式,用前导零而不是用空格填充字段宽度。如果出现-标志或者指定了精度(对于整数)则忽略该标志。示例:“0d”和“.3f” |
scanf#
转换说明符#
ANSIC 中
转换说明符 | 意义 |
---|---|
%c | 把输入解释成一个字符 |
%d | 把输入解释成一个有符号十进制整数 |
%e,%f,%g,%a | 把输入解释成一个浮点数(%a 是 C99 标准) |
%E,%F,%G,%A | 把输入解释成一个浮点数 (%A 是 C99 标准) |
%i | 把输入解释成一个有符号十进制整数 |
%o | 把输入解释成一个有符号八进制数 |
%p | 把输入解释成一个指针(地址) |
%s | 把输入解释成一个字符串;输入的内容以一个非空白字符作为开始,并且包含知道下一个空白字符的全部字符 |
%u | 把输入解释成一个无符号十进制整数 |
%x,%X | 把输入解释成一个有符号十六进制整数 |
转换修饰符#
转换修饰符 | 意义 |
---|---|
* | 滞后赋值。示例:“%*d” |
digit(s) | 最大字段宽度;在达到最大字段宽度或者遇到第一个空白字符时(不管哪一个先发生都一样)停止对输入项的读取。示例:“s” |
hh | 把整数读作 signed char 或 unsigned char 。示例:“%hhd”“%hhu” |
ll | 把整数读作 long long 或者 unsigned long long (C99)。示例:“%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 类型存储。将 L(而非 l)与 e、f 和 g 一起使用指示该值以 long double 类型存储。 |
如果没有这些修饰符,d、i、o 和 x 指示 int 类型,而 e、f 和 g 指示 float 类型。