C语言常见概念
转义字符
转义字符,顾名思义,转变原来意思的字符
比如
#include <stdio.h>
int main()
{
printf("abcndef");
return 0;
}
输出的结果为:
将代码修改一下:
#include <stdio.h>
int main()
{
printf("abc\ndef");
return 0;
}
输出的结果变为:
\n就是一个转义字符,表示换行
常见的转义字符如下:
\?
在书写连续多个问号时使用,防止他们被解析成三字母词,在新的编译器上没法验证了
\'
用于表示字符常量’
\"
用于表示一个字符串内部的双引号
\\
用于表示一个反斜杠,防止它被解释为一个转义序列符
\a
警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生
\b
退格键,光标回退一个字符,但不删除字符
\f
换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v
\n
换行符
\r
回车符,光标移到同一行的开头
\t
制表符,光标移到下一个水平制表位,通常是下一个4/8的倍数
\v
垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列
下面2种转义字符可以理解为:字符的8进制或者16进制表示形式:
\ddd:d d d表示1~3个八进制的数字
如:\130 表示字符X
\xdd:d d表示2个十六进制数字。
如:\x30 表示字符0
\e
null 字符,代表没有内容,\e 就是\ddd这类转义字符的一种,用于字符串的结束标志,其ASCII码值是0.
三字母词
??) 输出为 ]
??( 输出为 [
例如
#include <stdio.h>
int main(){
printf("(are you ok??)");
return 0;
}
输出应为:( are you ok]
但实际:
因为当前的编译器已经不再支持三字母词了
正确的写法应该为:
#include <stdio.h>
int main(){
printf("(are you ok\?\?)");
return 0;
}
打印单引号:
错误示范:
#include <stdio.h>
int main(){
printf("%c\n",''');
return 0;
}
这是因为中间的单引号与左面的单引号结合成一对
故,应该将中间的单引号转义:
#include <stdio.h>
int main(){
printf("%c\n",'\'');
return 0;
}
输出结果为一个单引号:
同理,打印双引号:
#include <stdio.h>
int main(){
printf("%c\n",'\"');
return 0;
}
打印\
当我们想打印:c:\test\ddd\test.c的时候,若编写代码如下:
#include <stdio.h>
int main(){
printf("c:\test\ddd\test.c");
return 0;
}
就会发现输出很奇怪:
这是因为编译器识别的时候,将\当成了转义字符
正确代码如下:
#include <stdio.h>
int main(){
printf("c:\\test\\ddd\\test.c");
return 0;
}
这时候,我们就得到了想要的输出:
\b
#include <stdio.h>
int main(){
printf("abcdef");
getchar();//读取一个字符
return 0;
}
此时光标位置:
添加\b后:
#include <stdio.h>
int main(){
printf("abcdef\b");
getchar();//读取一个字符
return 0;
}
如果在这之后打印一个x:
#include <stdio.h>
int main(){
printf("abcdef\b");
printf("x");
getchar();//读取一个字符
return 0;
}
则输出:
会发现:x将f覆盖
\t
#include <stdio.h>
int main(){
printf("a\taa\taaa\taaaa\txx");
return 0;
}
输出为:
可以看出:从开始打印a到打印aa之前,为8个字符
也就是说,a和aa之间跳过了七个字符,aa和aaa之间跳过了六个字符…以此类推
\ddd
#include <stdio.h>
int main(){
printf("%c\n",'\130');
return 0;
}
说明,八进制中130代表X
怎么来的呢?
从末位开始,八进制情况下,分别代表8的0次幂,8的1次幂…依次递增
esp:130:1×64 + 3×8+ 0×1=88, 而ASC码值88对应的就是X字符
\0就是\ddd形式的转义字符
\xdd
#include <stdio.h>
int main(){
printf("%c\n",'\x30');
return 0;
}
十六进制中,30对应的十进制数字,与八进制同理,为:
3×16+0×1=48
而ASC码值为48对应的是0
故打印结果为0
一个练习:
#include <stdio.h>
#include <string.h>
int main(){
//int len=strlen("abc");
//a b c \0
//strlen统计的是字符串中\0之前的字符个数 ,不算\0
//8进制的数字是0~7组成的
//16进制的数字是由0~9+A~F表示(0~15)
int len=strlen("c:\test\abc\182\test.c") ;
printf("%d",len);
return 0;
}
练习:数一数这个字符串有多少个字符
故为,18个
但如果将182改为123,会发现,变为16个字符
这是因为:
\123会被视为\ddd的结构从而变为1个字符
语句和语句的分类
C语言的代码是由一条一条的语句构成,C语言中的语句可分为五类:
1.空语句
2.表达式语句
3.函数调用语句
4.复合语句
5.控制语句
空语句
#include <stdio.h>
int main(){
;
return 0;
}
表达式语句
#include <stdio.h>
int main(){
3+4;
return 0;
}
函数调用语句
#include <stdio.h>
int main(){
printf("hehe");
return 0;
}
复合语句(代码块)
#include <stdio.h>
int main(){
{}
return 0;
}
控制语句
#include <stdio.h>
int main(){
//if switch for....
return 0;
}
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构: 顺序结构、选择结构、循环结构),它们由特定的语句定义符组成
C语言有九种控制语句。可分成以下三类:
1.条件判断语句也叫分支语句:if语句、switch语句
2.循环执行语句: do while语句、while语句、for语句
3.转向语句: break语句、goto语句、continue语句、return语句
注释
注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。注释是给程序员自己,或者其他程序员看的
好的注释可以帮我们更好的理解代码,但是也不要过度注释,不要写没必要的注释当然不写注释可能会让后期阅读代码的人抓狂
注释的2种形式:
/**/的形式
第一种方法是将注释放在/* … */之间,内部可以分行
/* 注释 */
/*
这是一行注释
*/
这种注释可以插在行内,但不可以嵌套
/开始注释后,遇到第一个/就认为注释结束了。
//的形式
第二种写法是将注释放在双斜杠 //后面,从双斜杠到行尾都属于注释。这种注释只能是单行,可以放在行首,也可以放在一行语句的结尾。这是C99标准新增的语法。
//这是一行注释
int i=1;//这是一行注释
不管是哪一种注释,都不能放在双引号里面
双引号里面的注释符号,会成为字符串的一部分,解释为普通符号,失去注释作用
注释会被替换成空格
int num2;
int num/*he*/2;
第二种就会变为
int num 2;