c语言书写规范:
*标识符,变量、函数、宏、其他实体的名称
1 以字母、下划线开头
2 可以包含字母、下划线、shuzi
3 大小写敏感
4不能和关键字冲突
5 限长:c89声称可以任意,但编译器只记住前31个
c99是63个
*关键字
有特殊含义的字符串
全部小写
标准库中的函数名全部小写
*语句可以分开放在任意多行
空格使我们更容易区分缩进有助于轻松识别程序嵌套
空行可以把程序划分成逻辑单元
驼峰命名方式(从第二个单词开始,每个单词首字母大写)和下划线区分方式(单词间加下划线)
*基本类型
c中,基本类型只有char int float double四种
有符号signed(默认)--float、double是有符号的
无符号unsigned
char和int分有、无符号
unsiged int i;无符号 %u
signed int i;有符号
int i;有符号
char c;是否有符号取决于编译器
short和long ( int )
short int i;短整型
long int i;长整型
二进制位bit 字节Byte 1Byte=8bit
int 16位 2字节/32位 4字节....取决于计算机
unsigned short int 0~65535 %hd
short int 16位 2字节 -32768~32767 %hd
long int 32位 最少 4字节
unsigned 0~4294967295
int -2147483648~2147483647
c99增加的类型:
long long int i;
unsigned lng long int i;
有些编译器支持非标准的128位整数
sizeof();
字面值和常量:
1 整数常量(字面值):
3 int
3.4 double
4.5f float
4.5l long int
56ll long long
#include<stdio.h>
int main()
{
int i;
i=10;
printf("i=%d ",i);
i=1010;//八进制
printf("i=%d /n",i);
i=0x10;//十六进制
printf("i=%d /n",i);
return 0;
}
各进制之间的转换
三种浮点数:
float:单精度
double:双精度
long double:扩展双精度
float:38
double:308
浮点常量:
57.0e+/-n
char各ASCLL
A 65
a 97
0 48
c标准没有说明普通char是有符号还是无符号
c语言对字符类型视为整数类型
特殊字符
/a响铃
/b退格
/n换行
/r回车,回到行首
/t水平制表符
/v垂直制表符
//斜线
/?问号
/'单引号
/"双引号
printf()和scanf():
%i%d int
%f&lf float/double
%hd%ld short int/long int
%u 无符号十进制
%c 字符
%s 字符串
%p 地址
%o 八进制
%x%X 十六进制
%g float/double 去尾零
%e%E 科学计数法
%% %
scanf中的 %c前加一个空格,可以忽略空白
sizeof(类型/变量名/表达式)
只关心类型,不会对括号内的表达式进行运算
作业:打印所有类型所占内存空间
() [] ->
! ~ ++ -- + - * &(type)sizeof()
* /
当运算符/和%用于操作负数,其结果未定义
C89中,操作数的其中之一是负数,结果可以向上取整,也可以向下取整。如-9/7的结果可以是-1,也可以是-2。
如果i和j其中一个是负数,i%j的结果依赖具体实现
C99中, 除法的结果总是向零截取,因此 -9/7的结果是-1,i%j的结果符号与i相同。
13位
奇数和偶数分别相加a b
a+3*b-1再对10取余n
9-n
左值:表示存储在计算机内存中的对象
赋值运算要求左操作数必须是一个左值
逻辑运算:
#include<stdio.h>
int main()
{
int a,b,c,d;
a=2;
b=3;
c=4;
d=5;
if(a>b && b++>c && c++>a)
puts("OK");
//短路运算
int r=a>b && b++>c&& c++>a;
printf("a=%d,b=%d,c=%d,r=%d/n",a,b,c,r);
r=a>b++ || b>c++ || c>a++;
printf("a=%d,b=%d,c=%d,r=%d/n",a,b,c,r);
}
!a>b 0大于b
按位运算:
按位与 &
56&23=?
111000&010111=010000=16
//可以将指定二进制位 置0
0xBD & 0xF7
1011 1 101 & 1111 0 111
//可以知道指定的位是1还是0
0xB5 & 0x8
1011 0 101 & 0000 1 000
按位或 |
-18:
原码->反码-> 补码
18的原码:0 0 0 00 0 0 0 00010010
18的反码:1 1 1 1 1 1 1 1 1 1101101
18的补码:(反码加1)
补码的反码加1:00000000 00010001+1=00000000 00010010
-18为18的反码除符号位取反:10000000 00010010
//把指定的二进制位 置1
0xB5 | 0x8
1011 0 101 | 0000 1 000
//可以知道指定的位是1还是0
0xBD | 0xF7
1011 1 101 | 0000 0 111
按位异或:^ 加1 反转符号
// 把指定的位反转
11011 0 11 ^ 00000 1 00=11011 1 11
按位取反:~
移位运算:
<< 左移:最低位补0
>> 右移:最高位补符号位,无符号数补零
在没有丢掉有效数时,左移n位相当于*2^n,右移n位相当于/2^n
x=0xABCDEF
x&0xFF
(x>>=8)&0xFF
(x>>=8)&0xFF
(x>>=8)&0xFF
地址运算符:
&取地址
* 根据变量取地址 间接寻址运算符
*&x==x
各类型的转换
int i;
int n=50
printf("i=%d/n",i);
if(0<=i<=n)// 0<=i => 1 ,1<=n =>1
printf("ok");//结果能出来。
for(1;2;3)语句;
1--初始化
2--条件判断,没有时,出现死循环
3--步进,没有时可能出现死循环
for(;;) while(1)--死循环
/*数组:含有多个数据值的数据结构,每个数据值具有相同的数据类型,这些数据称为元素*/
#include<stdio.h>
int main()
{
int x=100;
int a[5];//a数组,有5个元素,5个int变量
int i=200,j=300;
a[0]=10;
a[1]=20;
a[3]=30;
a[4]=50;
//a[5]=60; 下标越界,可能破坏其他内存里数据,可能出现段错误
/*段错误:使用的逻辑地址没有对应的物理空间(逻辑内存空间与物理空间没有形成映射)*/
printf("x=%d,i=%d,j=%d/n",x,i,j);
printf("&x=%p,&a[5]=%p/n",&x,a[5]);
for(int i=0;i<5;i++)
printf("%d ",a[i]);
printf("/n");
}
#include<stdio.h>
int main()
{
int i,num[5];
printf("Please input some number:/n");
for(i=0;i<=4;i++)
scanf("%d",&num[i]);
printf("反向输出数:");
for(i=4;i>=0;i--)
printf("%d",num[i]);
printf("/n");
}