这些细碎知识点平时也没怎么去刻意注意过,也是上学期期末考试认真总结了一下,过了几个月早都忘了…今天再次看到还是再次总结一下加深印象吧。
-
双目运算符,即运算符要求有两个运算量;
-
再次区分 ++i和i++
++i、- -i:它的功能是在i使用之前,i值先+/-1
i++、i- -:它的功能是在i使用之后,i值先+/-1
eg.
j=3;k=++j; //j先+1,再将j赋值给k,结果 k=4 j=4;
j=3;k=j++; //j先赋值给k,然后+1,结果 k=3 j=4; -
正号运算符(+x、-x)
它们的优先级高于*、/、%,而与++、- -优先级相同,故结合方向为 自右向左
eg.
i=3;j = -i++;
表达式 - i++相当于 - (i++),即先计算i++,则i=4;再做负值运算,表达式的值为-3,再将 -3赋值给变量j
结果:i=4,j=-3 -
结合性
算术运算符为左结合性;
eg.
x+y-z ,先执行x+y,再执行-z
** 赋值运算符为右结合性;**
eg.
x=y=z ,先执行y=z,再执行x=y -
数据范围汇总
int —>32位,最高位是正负位所以实际值只有31位,那它的最大值=2^31-1 = 2147483647.
unsigned int —>2^32 -1 = 4294967295
long long —>2^63 -1 = 9223372036854775807
unsigned long long —>2^64-1=18446744073709551615 -
为什么在C语言中,用scanf输入字符串时,不需加&
因为字符串变量名在 scanf 语句里 表示指针 (地址) 例如: char s[80]; scanf("%s",s); — 这里的s 已是地址。 当然,写成 scanf("%s",&s[0] ); 也可以, &s[0] 是地址 -
a?b:c是什么意思
这个是条件表达式,表示如果a为真,则表达式值为b,如果a为假,则表达式值为c -
typedef long long ll;
typedef c语言中自定义, typedef long long ll; 把long long 定义成了ll,这样在程序书写过程中用到long long(int) 的地方直接ll 即可,这样书写简单,也节省时间 -
标识符:某种语言成分的名字:变量名、常量名、函数名
字母、数字、下划线_ 组成,必须由字母、下划线开头
2ab X a@b X
关键字:if else int char float double 等等都是关键字,是由系统保留下来有特殊含义的字母组合,不能挪作它用。
预定义的标识符:printf、scanf、main,有特定的含义,不建议挪作它用。
用户自定义的标识符:这种由程序员自己定义使用 int a,b,;
(定义变量时最好一行一个变量)
‘ ; ’ 的用法
除了在 for语句中为 隔开 其余部分均为结束 -
数据类型(是因为c语言是强类型语言,在C中,所有的数据都有类型,变量在使用之前,一定要先定义)
基本数据类型
int 整型 16bits -215~215-1
char 字符类型 8bits -27~27-1
float 单精度浮点数 32bits ieee754
double 双精度浮点数 64bits ieee754
构造类型 数组 结构类型 联合类型 枚举类型 指针类型(地址类型) void 空类型(无返回值) 类型的修饰符 signed由符号位、unsigned无符号位、short、long 都可以放在int之前 signed int(int)(signed) 16bits -2^15~2^15-1 unsigned int(unsigned) 16bits 0~2^16-1 short int(short) 16bits -2^15~2^15-1 long int(long) 32bits -2^31~2^31-1 signed short unsigned short signed long unsigned long long long signed、unsigned 还可以放在char前面 signed char(char) 8bits -2^7~2^7-1 unsigned char 8bits 0~2^8-1 long 可以放在double前 long double 128bits char 不可扩展和缩短故位数不变 缩短:只保留地位,删除高位
类型转换(计算表达式或者是赋值的时候会发生类型的转换) 隐式类型转换(自动转换) 如下图(右边无条件变为左边) 1+2//int
1+2L//long 1+‘a’//int int a=1 char
b=‘a’//在运算时把b的值转化为int,而b本身的类型仍然是char
1+2L+3.1//double,最终的结果类型和表达式中最宽类型是一致的 ‘a’+‘b’//int 强制类型转换(显示类型转换) int
a =12345; char b; b=a;//值保留低位字节,高位字节舍去
(char) m + (char)n //为int (char)x+y (char)(x+y)
PS. b占一个字节 a=10占四个字节
多余的数字正数用0补 负数用1补
%d 为ASCII %c 为a
-
常量
一般够用即可,浮点数在计算机内表示不精确
属于long eg.6000l/L 12L 长整形
单精度: 1.23f/F
双精度:1.23(double)
字面常量: 112、‘a’、“abc”
整型常量: 12(int) 12L(long) 12l(long)
0123(8进制数) 0开头的数码表示8进制
0x1a(16进制数 ) 0x开头的数码表示16进制
浮点常量:
1.23e4(1.23X10^4) e后面必须是整数,不可以是带小数点的数
1.23e0.3 X 1.23e X e3 X 1.e3 对 1. 对 .1 对 . X
小数点左右必出现一个数字 e的左右必有数字字符常量:‘a’(char)
转义字符:由\引导的字符,表示被引导的字符被转义了
\n 回车换行
\t 下一个制表位 (做数据分析的排版)
\b 退格
\r 回车
\
" "
’ ’
\ddd d表示的是1~3位的8进制数, \123表示的是某个字符的ASCII编码
\xhh h是16进制数 \x1a
字符串常量(规定为指针类型):“abc” 若干个字符(0含以上) “” 空字符串 " " 空格字符串
‘ ’对 ‘’错
符号常量
#define 预处理指令(不属于语句)
const int a = 10;(a的值不可变) C语句
int a=10;(a的值可变)
枚举类型中的标识符
可数类型 :整数 字符 枚举类型 逻辑
不可数类型:浮点 字符串
- 变量
值可以发生变化的量
所有的变量在使用之前,必须定义
类型名 变量名[ = 值] ; int a = 10;
类型名 变量表(变量名之间用,隔开) int a = 10, b = 20, c;
如果变量没有经过初始化(变量的第一个值就是初始值),那么变量的值为随机值
即变量的第一个值
13.表达式
由若干个(0个或0个以上)操作符连接起来的式子, 必须能够计算出结果来,有结果,表达式就有类型
操作符(运算符,都有运算的优先级,加小括号可以改变优先级):
算术运算符(左结合): + - * / % 模 /的左右如果都是整型的数值,那么为整除,只要出现一个浮点数,那么就是除法; %为取余运算,也叫模运算
±低于%/
比较运算(关系运算) : > >= < <= != 运 算结果为0(假) 1(真) ,
、!=优先级比> >= < <=低
逻辑运算: ! && || 逻辑运算的优先级低于比较运算, 运算结果为0(假) 1(真),参与逻辑运算的运算数可以是0(假) 和非零(真) 的数 1||2 结果为 1
! && || 优先级逐渐降低
!(a||b)<=> !a&&!b !(a&&b)<=>!a||!b
b=3
if(b=1||3||5||7||8||10||12)printf(“a”); 应为b1||b3||b==5
if(b=4||6||9||11)printf(“b”);
if(b=2)printf(“c”);
错误 最后abc都会输出 因为 = 为赋值 ==才为等于
赋值运算: 把某个表达式的值放入某个变量中
a = b; 2 = a; X a + b = c X a = 2 这个赋值运算的计算结果为2
a+b=2 错 a+b为一个值不能为2 常量的值不可被改变
短路现象:
a = b = c = 2 <=> a = (b = (c = 2)) a+(b=2)=a+2
复合赋值: e1 op= e2 <=> e1 = e1 op (e2)
a *= b + c <=> a = a * (b + c)
自增自减:++ -- 它表示相应的变量值增1,或者减1;这两个运算符可以放在变量的前面,也可以放在变量的后面,含义是有区别的:
放在前面,表示先自增或自减,然后取相应变量的值作为该表达式的计算结果,例如:
int a = 1;
int b;
b = ++a; (a=a+1、b=a+1)
//b,a? 2 2
放在后面,表示先取变量的值作为表达式的计算结果,然后变量再自增或者自减
int a = 1;
int b;
b = a++;
//b,a? 1 2
-
语句
控制语句:if 、while、for switch等等
函数的调用语句:printf、scanf
表达式语句:a++、a=1;
复合语句:若干条语句用{}括起来,}后面通常没有;
空语句:; {} 空语句主要起占位的作用,例如:
if(a > b){} //if后一定要加{}
#开头的不是C的语句,它属于C的预处理指令
- 输入输出
首先你得用include把某个头文件包含进来: #include <stdio.h>
printf(“输出字符串”. 表达式表) ;
输出字符串中可以有两种字符,一种是普通字符,它会原样输出,另一种是类型字符
类型字符:常用d f c s
类型字符必须和后面的表达式的类型一一对应
printf("% 4d", 12) ; //
scanf("格式字符串", 变量的地址表) ;
格式字符串中如果出现一般字符,在输入的时候,要对应输入
scanf("a=%d", &a) ; //a=12
PS: 若出现闪退现象,检查scanf
printf % d 中间的空格有特殊含义
scanf % d 不正确
- 字符串与字符数组
1 .字符串:结束字符为‘\0’or 0 字符数组结束以最后一个字符结尾
2 .printf (‘%c’,1234); 先转化为二进制,只去最后一个字节(XXXXXXXX)
3 .char c[10]; 没有初始化,故为随机值 字符数组可以用来放字符串,最好要有‘\0’
4 .字符串输入是不加 & ,本身就是地址
5 .区分scanf() gets() printf() puts()
6 .数组是常量不能赋值
7 .字符串长度可求strlen() 字符数组长度不可求
- 的
- 的