首页
前端面试题
前端报错总结
电子书
更多
插件下载
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语言入门
标准库
嵌入式
页面
前端面试题
前端报错总结
电子书
插件下载
搜索到
41
篇与
的结果
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
...
13
14