首页
前端面试题
前端报错总结
电子书
更多
插件下载
Search
1
JavaScript基础(二)操作符 流程控制
42 阅读
2
HTML基础
20 阅读
3
Vue基础
17 阅读
4
wctype.h
14 阅读
5
Vue2(知识点)
13 阅读
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
登录
Search
liuxiaobai
累计撰写
108
篇文章
累计收到
12
条评论
首页
栏目
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
页面
前端面试题
前端报错总结
电子书
插件下载
搜索到
104
篇与
的结果
2023-09-20
运算符
运算符C 语言的运算符非常多,一共有 50 多种,可以分成若干类。算术运算符算术运算符专门用于算术运算,主要有下面几种。+:正值运算符(一元运算符)-:负值运算符(一元运算符)+:加法运算符(二元运算符)-:减法运算符(二元运算符)*:乘法运算符/:除法运算符%:余值运算符(1)+,-+和-既可以作为一元运算符,也可以作为二元运算符。所谓“一元运算符”,指的是只需要一个运算数就可以执行。一元运算符-用来改变一个值的正负号。int x = -12;上面示例中,-将12这个值变成-12。一元运算符+对正负值没有影响,是一个完全可以省略的运算符,但是写了也不会报错。int x = -12; int y = +x;上面示例中,变量y的值还是-12,因为+不会改变正负值。二元运算符+和-用来完成加法和减法。int x = 4 + 22; int y = 61 - 23;(2)*运算符*用来完成乘法。int num = 5; printf("%i\n", num * num); // 输出 25(3)/运算符/用来完成除法。注意,两个整数相除,得到还是一个整数。float x = 6 / 4; printf("%f\n", x); // 输出 1.000000上面示例中,尽管变量x的类型是float(浮点数),但是6 / 4得到的结果是1.0,而不是1.5。原因就在于 C 语言里面的整数除法是整除,只会返回整数部分,丢弃小数部分。如果希望得到浮点数的结果,两个运算数必须至少有一个浮点数,这时 C 语言就会进行浮点数除法。float x = 6.0 / 4; // 或者写成 6 / 4.0 printf("%f\n", x); // 输出 1.500000上面示例中,6.0 / 4表示进行浮点数除法,得到的结果就是1.5。下面是另一个例子。int score = 5; score = (score / 20) * 100;上面的代码,你可能觉得经过运算,score会等于25,但是实际上score等于0。这是因为score / 20是整除,会得到一个整数值0,所以乘以100后得到的也是0。为了得到预想的结果,可以将除数20改成20.0,让整除变成浮点数除法。score = (score / 20.0) * 100;(4)%运算符%表示求模运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。int x = 6 % 4; // 2负数求模的规则是,结果的正负号由第一个运算数的正负号决定。11 % -5 // 1 -11 % -5 // -1 -11 % 5 // -1上面示例中,第一个运算数的正负号(11或-11)决定了结果的正负号。(5)赋值运算的简写形式如果变量对自身的值进行算术运算,C 语言提供了简写形式,允许将赋值运算符和算术运算符结合成一个运算符。+=-=*=/=%=下面是一些例子。i += 3; // 等同于 i = i + 3 i -= 8; // 等同于 i = i - 8 i *= 9; // 等同于 i = i * 9 i /= 2; // 等同于 i = i / 2 i %= 5; // 等同于 i = i % 5自增运算符,自减运算符C 语言提供两个运算符,对变量自身进行+ 1和- 1的操作。++:自增运算符--:自减运算符i++; // 等同于 i = i + 1 i--; // 等同于 i = i - 1这两个运算符放在变量的前面或后面,结果是不一样的。++var和--var是先执行自增或自减操作,再返回操作后var的值;var++和var--则是先返回操作前var的值,再执行自增或自减操作。int i = 42; int j; j = (i++ + 10); // i: 43 // j: 52 j = (++i + 10) // i: 44 // j: 54上面示例中,自增运算符的位置差异,会导致变量j得到不同的值。这样的写法很容易出现意料之外的结果,为了消除意外,可以改用下面的写法。/* 写法一 */ j = (i + 10); i++; /* 写法二 */ i++; j = (i + 10);上面示例中,变量i的自增运算与返回值是分离的两个步骤,这样就不太会出错,也提高了代码的可读性。关系运算符C 语言用于比较的表达式,称为“关系表达式”(relational expression),里面使用的运算符就称为“关系运算符”(relational operator),主要有下面6个。> 大于运算符< 小于运算符>= 大于等于运算符<= 小于等于运算符== 相等运算符!= 不相等运算符下面是一些例子。a == b; a != b; a < b; a > b; a <= b; a >= b;关系表达式通常返回0或1,表示真伪。C 语言中,0表示伪,所有非零值表示真。比如,20 > 12返回1,12 > 20返回0。关系表达式常用于if或while结构。if (x == 3) { printf("x is 3.\n"); }注意,相等运算符==与赋值运算符=是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。if (x = 3) ...上面示例中,原意是x == 3,但是不小心写成x = 3。这个式子表示对变量x赋值3,它的返回值为3,所以if判断总是为真。为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。if (3 == x) ...这样的话,如果把==误写成=,编译器就会报错。/* 报错 */ if (3 = x) ...另一个需要避免的错误是,多个关系运算符不宜连用。i < j < k上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果,即不是保证变量j的值在i和k之间。因为关系运算符是从左到右计算,所以实际执行的是下面的表达式。(i < j) < k上面式子中,i < j返回0或1,所以最终是0或1与变量k进行比较。如果想要判断变量j的值是否在i和k之间,应该使用下面的写法。i < j && j < k逻辑运算符逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。!:否运算符(改变单个表达式的真伪)。&&:与运算符(两侧的表达式都为真,则为真,否则为伪)。||:或运算符(两侧至少有一个表达式为真,则为真,否则为伪)。下面是与运算符的例子。if (x < 10 && y > 20) printf("Doing something!\n");上面示例中,只有x < 10和y > 20同时为真,x < 10 && y > 20才会为真。下面是否运算符的例子。if (!(x < 12)) printf("x is not less than 12\n");上面示例中,由于否运算符!具有比<更高的优先级,所以必须使用括号,才能对表达式x < 12进行否运算。当然,合理的写法是if (x >= 12),这里只是为了举例。对于逻辑运算符来说,任何非零值都表示真,零值表示伪。比如,5 || 0会返回1,5 && 0会返回0。逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。if (number != 0 && 12/number == 2)上面示例中,如果&&左侧的表达式(number != 0)为伪,即number等于0时,右侧的表达式(12/number == 2)是不会执行的。因为这时左侧表达式返回0,整个&&表达式肯定为伪,就直接返回0,不再执行右侧的表达式了。由于逻辑运算符的执行顺序是先左后右,所以下面的代码是有问题的。while ((x++ < 10) && (x + y < 20))上面示例中,执行左侧表达式后,变量x的值就已经变了。等到执行右侧表达式的时候,是用新的值在计算,这通常不是原始意图。位运算符C 语言提供一些位运算符,用来操作二进制位(bit)。(1)取反运算符~取反运算符~是一个一元运算符,用来将每一个二进制位变成相反值,即0变成1,1变成0。// 返回 01101100 ~ 10010011上面示例中,~对每个二进制位取反,就得到了一个新的值。注意,~运算符不会改变变量的值,只是返回一个新的值。(2)与运算符&与运算符&将两个值的每一个二进制位进行比较,返回一个新的值。当两个二进制位都为1,就返回1,否则返回0。// 返回 00010001 10010011 & 00111101上面示例中,两个八位二进制数进行逐位比较,返回一个新的值。与运算符&可以与赋值运算符=结合,简写成&=。int val = 3; val = val & 0377; // 简写成 val &= 0377;(3)或运算符|或运算符|将两个值的每一个二进制位进行比较,返回一个新的值。两个二进制位只要有一个为1(包含两个都为1的情况),就返回1,否则返回0。// 返回 10111111 10010011 | 00111101或运算符|可以与赋值运算符=结合,简写成|=。int val = 3; val = val | 0377; // 简写为 val |= 0377;(4)异或运算符^异或运算符^将两个值的每一个二进制位进行比较,返回一个新的值。两个二进制位有且仅有一个为1,就返回1,否则返回0。// 返回 10101110 10010011 ^ 00111101异或运算符^可以与赋值运算符=结合,简写成^=。int val = 3; val = val ^ 0377; // 简写为 val ^= 0377;(5)左移运算符<<左移运算符<<将左侧运算数的每一位,向左移动指定的位数,尾部空出来的位置使用0填充。// 1000101000 10001010 << 2上面示例中,10001010的每一个二进制位,都向左侧移动了两位。左移运算符相当于将运算数乘以2的指定次方,比如左移2位相当于乘以4(2的2次方)。左移运算符<<可以与赋值运算符=结合,简写成<<=。int val = 1; val = val << 2; // 简写为 val <<= 2;(6)右移运算符>>右移运算符>>将左侧运算数的每一位,向右移动指定的位数,尾部无法容纳的值将丢弃,头部空出来的位置使用0填充。// 返回 00100010 10001010 >> 2上面示例中,10001010的每一个二进制位,都向右移动两位。最低的两位10被丢弃,头部多出来的两位补0,所以最后得到00100010。注意,右移运算符最好只用于无符号整数,不要用于负数。因为不同系统对于右移后如何处理负数的符号位,有不同的做法,可能会得到不一样的结果。右移运算符相当于将运算数除以2的指定次方,比如右移2位就相当于除以4(2的2次方)。右移运算符>>可以与赋值运算符=结合,简写成>>=。int val = 1; val = val >> 2; // 简写为 val >>= 2;逗号运算符逗号运算符用于将多个表达式写在一起,从左到右依次运行每个表达式。x = 10, y = 20;上面示例中,有两个表达式(x = 10和y = 20),逗号使得它们可以放在同一条语句里面。逗号运算符返回最后一个表达式的值,作为整个语句的值。int x; x = (1, 2, 3);上面示例中,括号里面的逗号运算符,返回最后一个表达式的值,所以变量x等于3。运算优先级优先级指的是,如果一个表达式包含多个运算符,哪个运算符应该优先执行。各种运算符的优先级是不一样的。3 + 4 * 5;上面示例中,表达式3 + 4 * 5里面既有加法运算符(+),又有乘法运算符(*)。由于乘法的优先级高于加法,所以会先计算4 * 5,而不是先计算3 + 4。如果两个运算符优先级相同,则根据运算符是左结合,还是右结合,决定执行顺序。大部分运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),比如赋值运算符(=)。5 * 6 / 2;上面示例中,*和/的优先级相同,它们都是左结合运算符,所以从左到右执行,先计算5 * 6,再计算30 / 2。运算符的优先级顺序很复杂。下面是部分运算符的优先级顺序(按照优先级从高到低排列)。圆括号(())自增运算符(++),自减运算符(--)一元运算符(+和-)乘法(*),除法(/)加法(+),减法(-)关系运算符(<、>等)赋值运算符(=)由于圆括号的优先级最高,可以使用它改变其他运算符的优先级。int x = (3 + 4) * 5;上面示例中,由于添加了圆括号,加法会先于乘法进行运算。完全记住所有运算符的优先级没有必要,解决方法是多用圆括号,防止出现意料之外的情况,也有利于提高代码的可读性。
2023年09月20日
5 阅读
0 评论
0 点赞
2023-09-20
变量
变量变量(variable)可以理解成一块内存区域的名字。通过变量名,可以引用这块内存区域,获取里面存储的值。由于值可能发生变化,所以称为变量,否则就是常量了。变量名变量名在 C 语言里面属于标识符(identifier),命名有严格的规范。只能由字母(包括大写和小写)、数字和下划线(_)组成。不能以数字开头。长度不能超过63个字符。下面是一些无效变量名的例子。$zj j**p 2cat Hot-tab tax rate don't上面示例中,每一行的变量名都是无效的。变量名区分大小写,star、Star、STAR都是不同的变量。并非所有的词都能用作变量名,有些词在 C 语言里面有特殊含义(比如int),另一些词是命令(比如continue),它们都称为关键字,不能用作变量名。另外,C 语言还保留了一些词,供未来使用,这些保留字也不能用作变量名。下面就是 C 语言主要的关键字和保留字。auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, inline, int, long, register, restrict, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while另外,两个下划线开头的变量名,以及一个下划线 + 大写英文字母开头的变量名,都是系统保留的,自己不应该起这样的变量名。变量的声明C 语言的变量,必须先声明后使用。如果一个变量没有声明,就直接使用,会报错。每个变量都有自己的类型(type)。声明变量时,必须把变量的类型告诉编译器。int height;上面代码声明了变量height,并且指定类型为int(整数)。如果几个变量具有相同类型,可以在同一行声明。int height, width; // 等同于 int height; int width;注意,声明变量的语句必须以分号结尾。一旦声明,变量的类型就不能在运行时修改。变量的赋值C 语言会在变量声明时,就为它分配内存空间,但是不会清除内存里面原来的值。这导致声明变量以后,变量会是一个随机的值。所以,变量一定要赋值以后才能使用。赋值操作通过赋值运算符(=)完成。int num; num = 42;上面示例中,第一行声明了一个整数变量num,第二行给这个变量赋值。变量的值应该与类型一致,不应该赋予不是同一个类型的值,比如num的类型是整数,就不应该赋值为小数。虽然 C 语言会自动转换类型,但是应该避免赋值运算符两侧的类型不一致。变量的声明和赋值,也可以写在一行。int num = 42;多个相同类型变量的赋值,可以写在同一行。int x = 1, y = 2;注意,赋值表达式有返回值,等于等号右边的值。int x, y; x = 1; y = (x = 2 * x);上面代码中,变量y的值就是赋值表达式(x = 2 * x)的返回值2。由于赋值表达式有返回值,所以 C 语言可以写出多重赋值表达式。int x, y, z, m, n; x = y = z = m = n = 3;上面的代码是合法代码,一次为多个变量赋值。赋值运算符是从右到左执行,所以先为n赋值,然后依次为m、z、y和x赋值。C 语言有左值(left value)和右值(right value)的概念。左值是可以放在赋值运算符左边的值,一般是变量;右值是可以放在赋值运算符右边的值,一般是一个具体的值。这是为了强调有些值不能放在赋值运算符的左边,比如x = 1是合法的表达式,但是1 = x就会报错。变量的作用域作用域(scope)指的是变量生效的范围。C 语言的变量作用域主要有两种:文件作用域(file scope)和块作用域(block scope)。文件作用域(file scope)指的是,在源码文件顶层声明的变量,从声明的位置到文件结束都有效。int x = 1; int main(void) { printf("%i\n", x); }上面示例中,变量x是在文件顶层声明的,从声明位置开始的整个当前文件都是它的作用域,可以在这个范围的任何地方读取这个变量,比如函数main()内部就可以读取这个变量。块作用域(block scope)指的是由大括号({})组成的代码块,它形成一个单独的作用域。凡是在块作用域里面声明的变量,只在当前代码块有效,代码块外部不可见。int a = 12; if (a == 12) { int b = 99; printf("%d %d\n", a, b); // 12 99 } printf("%d\n", a); // 12 printf("%d\n", b); // 出错上面例子中,变量b是在if代码块里面声明的,所以对于大括号外面的代码,这个变量是不存在的。代码块可以嵌套,即代码块内部还有代码块,这时就形成了多层的块作用域。它的规则是:内层代码块可以使用外层声明的变量,但外层不可以使用内层声明的变量。如果内层的变量与外层同名,那么会在当前作用域覆盖外层变量。{ int i = 10; { int i = 20; printf("%d\n", i); // 20 } printf("%d\n", i); // 10 }上面示例中,内层和外层都有一个变量i,每个作用域都会优先使用当前作用域声明的i。最常见的块作用域就是函数,函数内部声明的变量,对于函数外部是不可见的。for循环也是一个块作用域,循环变量只对循环体内部可见,外部是不可见的。for (int i = 0; i < 10; i++) printf("%d\n", i); printf("%d\n", i); // 出错上面示例中,for循环省略了大括号,但依然是一个块作用域,在外部读取循环变量i,编译器就会报错。
2023年09月20日
5 阅读
0 评论
0 点赞
2023-09-20
C 语言基本语法
C 语言基本语法语句C 语言的代码由一行行语句(statement)组成。语句就是程序执行的一个操作命令。C 语言规定,语句必须使用分号结尾,除非有明确规定可以不写分号。int x = 1;上面就是一个变量声明语句,声明整数变量x,并且将值设为1。多个语句可以写在一行。int x; x = 1;上面示例是两个语句写在一行。所以,语句之间的换行符并不是必需的,只是为了方便阅读代码。一个语句也可以写成多行,这时就要依靠分号判断语句在哪一行结束。int x; x = 1 ;上面示例中,第二个语句x = 1;被拆成了四行。编译器会自动忽略代码里面的换行。单个分号也是有效语句,称为“空语句”,虽然毫无作用。;表达式C 语言的各种计算,主要通过表达式完成。表达式(expression)是一个计算式,用来获取值。1 + 2上面代码就是一个表达式,用来获取1 + 2这个算术计算的结果。表达式加上分号,也可以成为语句,但是没有实际的作用。8; 3 + 4;上面示例是两个表达式,加上分号以后成为语句。表达式与语句的区别主要是两点:语句可以包含表达式,但是表达式本身不构成语句。表达式都有返回值,语句不一定有。因为语句用来执行某个命令,很多时候不需要返回值,比如变量声明语句(int x = 1)就没有返回值。语句块C 语言允许多个语句使用一对大括号{},组成一个块,也称为复合语句(compounded statement)。在语法上,语句块可以视为多个语句组成的一个复合语句。{ int x; x = 1; }上面示例中,大括号形成了一个语句块。大括号的结尾不需要添加分号。空格C 语言里面的空格,主要用来帮助编译器区分语法单位。如果语法单位不用空格就能区分,空格就不是必须的,只是为了增加代码的可读性。int x = 1; // 等同于 int x=1;上面示例中,赋值号(=)前后有没有空格都可以,因为编译器这里不借助空格,就能区分语法单位。语法单位之间的多个空格,等同于单个空格。int x = 1;上面示例中,各个语法单位之间的多个空格,跟单个空格的效果是一样的。空格还用来表示缩进。多层级的代码有没有缩进,其实对于编译器来说并没有差别,没有缩进的代码也是完全可以运行的。强调代码缩进,只是为了增强代码可读性,便于区分代码块。大多数 C 语言的风格要求是,下一级代码比上一级缩进4个空格。为了书写的紧凑,本书采用缩写两个空格。// 缩进四个空格 if (x > 0) printf("positive\n"); // 缩进两个空格 if (x > 0) printf("positive\n");只包含空格的行被称为空白行,编译器会完全忽略该行。注释注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。C 语言的注释有两种表示方法。第一种方法是将注释放在/*...*/之间,内部可以分行。/* 注释 */ /* 这是一行注释 */这种注释可以插在行内。int open(char* s /* file name */, int mode);上面示例中,/* file name */用来对函数参数进行说明,跟在它后面的代码依然会有效执行。这种注释一定不能忘记写结束符号*/,否则很容易导致错误。printf("a "); /* 注释一 printf("b "); printf("c "); /* 注释二 */ printf("d ");上面示例的原意是,第一行和第三行代码的尾部,有两个注释。但是,第一行注释忘记写结束符号,导致注释一延续到第三行结束。第二种写法是将注释放在双斜杠//后面,从双斜杠到行尾都属于注释。这种注释只能是单行,可以放在行首,也可以放在一行语句的结尾。这是 C99 标准新增的语法。// 这是一行注释 int x = 1; // 这也是注释不管是哪一种注释,都不能放在双引号里面。双引号里面的注释符号,会成为字符串的一部分,解释为普通符号,失去注释作用。printf("// hello /* world */ ");上面示例中,双引号里面的注释符号,都会被视为普通字符,没有注释作用。编译时,注释会被替换成一个空格,所以min/* space */Value会变成min Value,而不是minValue。printf()基本用法本书的示例会大量用到printf()函数,这里先介绍一下这个函数。printf()的作用是将参数文本输出到屏幕。它名字里面的f代表format(格式化),表示可以定制输出文本的格式。printf("Hello World");上面命令会在屏幕上输出一行文字“Hello World”。printf()不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个换行符\n。printf("Hello World\n");如果文本内部有换行,也是通过插入换行符来实现。printf("Hello\nWorld\n");上面示例先输出一个Hello,然后换行,在下一行开头输出World,然后又是一个换行。上面示例也可以写成两个printf(),效果完全一样。printf("Hello\n"); printf("World\n");printf()是在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。#include <stdio.h> int main(void) { printf("Hello World\n"); }上面示例中,只有在源码头部加上#include <stdio.h>,才能使用printf()这个函数。#include指令的详细解释,请看《预处理器》一章。占位符printf()可以在输出文本中指定占位符。所谓“占位符”,就是这个位置可以用其他值代入。// 输出 There are 3 apples printf("There are %i apples\n", 3);上面示例中,There are %i apples\n是输出文本,里面的%i就是占位符,表示这个位置要用其他值来替换。占位符的第一个字符一律为百分号%,第二个字符表示占位符的类型,%i表示这里代入的值必须是一个整数。printf()的第二个参数就是替换占位符的值,上面的例子是整数3替换%i。执行后的输出结果就是There are 3 apples。常用的占位符除了%i,还有%s表示代入的是字符串。printf("%s will come tonight\n", "Jane");上面示例中,%s表示代入的是一个字符串,所以printf()的第二个参数就必须是字符串,这个例子是Jane。执行后的输出就是Jane will come tonight。输出文本里面可以使用多个占位符。printf("%s says it is %i o'clock\n", "Ben", 21);上面示例中,输出文本%s says it is %i o'clock有两个占位符,第一个是字符串占位符%s,第二个是整数占位符%i,分别对应printf()的第二个参数(Ben)和第三个参数(21)。执行后的输出就是Ben says it is 21 o'clock。printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就应该有n + 1个。如果参数个数少于对应的占位符,printf()可能会输出内存中的任意值。printf()的占位符有许多种类,与 C 语言的数据类型相对应。下面按照字母顺序,列出常用的占位符,方便查找,具体含义在后面章节介绍。%a:十六进制浮点数,字母输出为小写。%A:十六进制浮点数,字母输出为大写。%c:字符。%d:十进制整数。%e:使用科学计数法的浮点数,指数部分的e为小写。%E:使用科学计数法的浮点数,指数部分的E为大写。%i:整数,基本等同于%d。%f:小数(包含float类型和double类型)。%g:6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e为小写。%G:等同于%g,唯一的区别是指数部分的E为大写。%hd:十进制 short int 类型。%ho:八进制 short int 类型。%hx:十六进制 short int 类型。%hu:unsigned short int 类型。%ld:十进制 long int 类型。%lo:八进制 long int 类型。%lx:十六进制 long int 类型。%lu:unsigned long int 类型。%lld:十进制 long long int 类型。%llo:八进制 long long int 类型。%llx:十六进制 long long int 类型。%llu:unsigned long long int 类型。%Le:科学计数法表示的 long double 类型浮点数。%Lf:long double 类型浮点数。%n:已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。%o:八进制整数。%p:指针。%s:字符串。%u:无符号整数(unsigned int)。%x:十六进制整数。%zd:size_t类型。%%:输出一个百分号。输出格式printf()可以定制占位符的输出格式。(1)限定宽度printf()允许限定占位符的最小宽度。printf("%5d\n", 123); // 输出为 " 123"上面示例中,%5d表示这个占位符的宽度至少为5位。如果不满5位,对应的值的前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,在输出内容后面添加空格,可以在占位符的%的后面插入一个-号。printf("%-5d\n", 123); // 输出为 "123 "上面示例中,输出内容123的后面添加了空格。对于小数,这个限定符会限制所有数字的最小显示宽度。// 输出 " 123.450000" printf("%12f\n", 123.45);上面示例中,%12f表示输出的浮点数最少要占据12位。由于小数的默认显示精度是小数点后6位,所以123.45输出结果的头部会添加2个空格。(2)总是显示正负号默认情况下,printf()不对正数显示+号,只对负数显示-号。如果想让正数也输出+号,可以在占位符的%后面加一个+。printf("%+d\n", 12); // 输出 +12 printf("%+d\n", -12); // 输出 -12上面示例中,%+d可以确保输出的数值,总是带有正负号。(3)限定小数位数输出小数时,有时希望限定小数的位数。举例来说,希望小数点后面只保留两位,占位符可以写成%.2f。// 输出 Number is 0.50 printf("Number is %.2f\n", 0.5);上面示例中,如果希望小数点后面输出3位(0.500),占位符就要写成%.3f。这种写法可以与限定宽度占位符,结合使用。// 输出为 " 0.50" printf("%6.2f\n", 0.5);上面示例中,%6.2f表示输出字符串最小宽度为6,小数位数为2。所以,输出字符串的头部有两个空格。最小宽度和小数位数这两个限定值,都可以用*代替,通过printf()的参数传入。printf("%*.*f\n", 6, 2, 0.5); // 等同于 printf("%6.2f\n", 0.5);上面示例中,%*.*f的两个星号通过printf()的两个参数6和2传入。(4)输出部分字符串%s占位符用来输出字符串,默认是全部输出。如果只想输出开头的部分,可以用%.[m]s指定输出的长度,其中[m]代表一个数字,表示所要输出的长度。// 输出 hello printf("%.5s\n", "hello world");上面示例中,占位符%.5s表示只输出字符串“hello world”的前5个字符,即“hello”。标准库,头文件程序需要用到的功能,不一定需要自己编写,C 语言可能已经自带了。程序员只要去调用这些自带的功能,就省得自己编写代码了。举例来说,printf()这个函数就是 C 语言自带的,只要去调用它,就能实现在屏幕上输出内容。C 语言自带的所有这些功能,统称为“标准库”(standard library),因为它们是写入标准的,到底包括哪些功能,应该怎么使用的,都是规定好的,这样才能保证代码的规范和可移植。不同的功能定义在不同的文件里面,这些文件统称为“头文件”(header file)。如果系统自带某一个功能,就一定还会自带描述这个功能的头文件,比如printf()的头文件就是系统自带的stdio.h。头文件的后缀通常是.h。如果要使用某个功能,就必须先加载对应的头文件,加载使用的是#include命令。这就是为什么使用printf()之前,必须先加载stdio.h的原因。#include <stdio.h>注意,加载头文件的#include语句不需要分号结尾,详见《预处理器》一章。
2023年09月20日
5 阅读
0 评论
0 点赞
1
...
17
18
19
...
35