标识符 做题时候注意 for if 之类条件语句有没有加括号 她们作用的范围!!!!!
定义变量时,我们使用了诸如 a、abc、mn123 这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用,这叫做标识符(Identifier)
标识符就是程序员自己起的名字,除了变量名,后面还会讲到函数名、宏名、结构体名等,它们都是标识符。不过,名字也不能随便起,要遵守规范;C语言规定,标识符只能由字母(A~Z, az)、数字(09)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。
以下是合法的标识符:
a, x, x3, BOOK_1, sum5
以下是非法的标识符:
- 3s 不能以数字开头
- s+T 出现非法字符+
- -3x 不能以减号(-)开头
- bowy-1 出现非法字符减号(-)
C文件
源程序 xxx.c 编译之后=> 目标程序 xxx.obj 连接之后=> 可执行程序=> xxx.exe
#define
#define FB(a,b) (a*b+1)
int k=3;
k=FB(FB(k,k+1),k)-7;
FB(k, k+1) => 3x3+1+1=11 FB(11, 3) => 11x3+1=34 34-7=27
#include<stdio.h>
#define PI 3.14
#define S(r) PI*r*r
int main(void)
{
printf("area = %f", S(1+2));
rerturn 0;
}
结果:
3.14x1+2x1+2 = 3.14+2+2 = 7.14
#define N 1+2
float a = N/2.0;
/*
按照常规做法,可能会认为结果是3/2 = 1.5
但是实际上,结果应该为1+2/2.0 = 2.0
若想要实现3/2,则#define N (1+2)
即为避免边缘效应,一定要加!括!号!
*/
字符、字符串
char i = ‘x’ ;
char i [4]=”xxxx”;
printf (“%c”, x);对单个字符进行输出
printf(“%s”, x);对字符串进行输出
string.h头文件的使用
定义方法:#include <string.h>
常用的几个函数及功能:
strchr() 查找字符
stremp() 比较字符串
strstr() 在字符串中查找字符串 ,使用方法:strstr(“被查找字符串”, “需要查找的字符串”);
strcpy() 复制字符串
strlen() 返回字符串的长度
strcat() 连接字符串
strdup() 复制字符串到堆上
strcmp() 用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str <str2 ,则返回负数;若str1>str2,则返回正数
atoi 函数(在<stdlib.h>库文件中),是把字符串转换成整型数的一个函数
sizeof()
struct student{
int num;
char name[30];
float score;
}stud1;
sizeof(stud1)的值 = 36
表达式sizeof(“hello”)的值是______。 6
同理
sizeof("\nsum=%d\n");
结果是9 \n 换行符算一个 一个8个字符 最后加个 \0.
void main(){
int a = 10;
char b = 'b';
short c = 2;
long d = 9;
float e = 6.29f;
double f = 95.0629;
int arr[] = { 1,2,3 };
char str[] = "hello"; //'\0'也被算进去
double *p=&f;
int *i=&a;
//分别对各个变量使用sizeof运算
printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d,arr=%d,str=%d point_p=%d,point_i=%d\n",
sizeof(a), sizeof(b), sizeof(c), sizeof(d), sizeof(e), sizeof(f),
sizeof(arr), sizeof(str), sizeof(p), sizeof(i));
system("pause");
}
输出的结果是:a=4,b=1,c=2,d=4,e=4,f=8,arr=12,str=6 point_p=4,point_i=4
######16位编译器
char :1个字节
char*(即指针变量): 2个字节
short int : 2个字节
int: 2个字节
unsigned int : 2个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
######32位编译器
char :1个字节
char*: 4个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
%
%d有符号整型int输出,%ld长整型输出,
%o以无符号八进制数形式输出整数,
%x以无符号十六进制数形式输出整数(0-9 a-f) 0x 代表16进制
%u以十进制数输出unsigned型int数据(无符号数)。
%c用来输出一个字符,
%s用来输出一个字符串,
%f用来输出实数,以float浮点型小数形式输出,
%m.nf:输出共占m列,其中有n位小数,若数值宽度小于m左端补空格。
%e以指数形式输出实数,
%g根据大小自动选f格式或e格式,且不输出无意义的零。
%p 指针,也就是指针指向的地址
指针
char ss[10]="02468",*s=ss;
while(*s++) //while执行完 s指向第二个元素 *++s s指向第三个元素 4 再输出值
putchar(*++s); //48
Static
#include “stdio.h"
int x;
void f(int x)
{static int a=1;
printf(“%d,”,a);
a+=x+2;
}
void main()
{int k;
for(k=1;k<=3;k++)
f(k);
}
输出 1,4,8 , static可以保存 a的值 第二次调用a=4 保留了第一次的值
运算符优先级
https://baike.baidu.com/item/运算符优先级/4752611?fr=aladdin
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
int x=3,y=6,z=0;
while(x++)!=(y-=1))
{z++;
if(x<y)break;
}
printf(“x=%d,y=%d,z=%d”.x.y.z);
x=4,y=5,z=1
计算题细节
1. 读入1个正整数n,计算并输出s的前n项的和。
s=1-1/2+1/3-1/4+……
int main()
{
int k,flag,n;
float s;
flag=1;s=0;
scanf("%d",&n);
for(k=1;k<=n;k++){
s=s+flag*1./k ; //这边一点要用1. 或者1.0
flag=-flag;
}
printf("sum=%f\n",s);
}
2.移位计算
M左移三位 n=M<<3;
同理 右移 >>x x表示位数。左移运算是将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。 输入的n如果是10进制 先把n转换成2进制,然后再移位,移位之后值再转换成10进制传给n。
3. ! 非运算
int main()
{
int a=10, b=0;
printf("%d",!!a); //1
printf("%d",!a); // 0
printf("%d",!b); // 1
printf("%d",!!b); //0
}
4. 指针数组
char *st[ ]={"ONE","TWO","FOUR","K"};
printf("%s, %c\n", *(st+1)+1, *(*(st+2)+2)-1); //输出 WO, T
*(st+1) 代表TWO *(st+1)+1 从TWO的第二个元素全部输出 //
*(st+2) 是FOUR, *(st+2)+2 是UR *(*(st+2)+2)就是UR中指向第一个的字符 就是U U-1 就是T
char *st[ ]={"ONE","TWO","FOUR","K"};
printf("%s, %c\n", *(st+2), **st+1);
**st+1 根据运算符优先级 首先 *st 指的是 *st第一个元素 ”ONE“
**st指的是 ”ONE“ 中的第一个元素 所以是 o, O+1就是P
5. Switch
switch(operator){
case '+': res = op1+op2; break;
case '-': res = op1-op2; break;
case '*': res = op1*op2; break;
case '/': res = op1/op2; break;
default: res = 0; //如果这里的operator不是 + - * / 那么 res都为0
}
6. 调用函数类型题
void f(int n)
{ if(n<3)
printf("%d", n);
else{
f(n/3); //第一次 相当于 f(5)
printf("%d", n%3); //n还是15 所以整除出来是0
}
输入n=15 输出 120
#include <stdio.h>
void p(int *x,int y)
{ ++ *x;
y=y+2;
}
void main()
{ int x=0, y=3;
p(&y, y);
printf("%d, %d", x, y);
}
输入0,4
再看这里 这里p(&y, y); 实际上通过指针改变y的值,第二个y只是形式参数,不改变Main中的y的值
7. 实型常量
double d = 6.023e23;//6.023*10的23次方
xxxeooo xxx:必须是个数,不能是空 ooo:必须是整数 正负都可以,不能是空
8. EOF
EOF 是个宏,其意思是:End Of File,文件尾标志。 从数值上来看,就是整数-1。当读文件操作时,遇到文件结束位置或读数据出错均会返回 EOF。 (C语言中所有的输入输出操作均是按读文件的思想来设计的,或者说,是文件操作的一种特例,如getchar()就是fgetc(stdin) 的一个宏 )
printf("%d", EOF); //-1
printf("%d", !EOF); //0
9. tydefine
(1)用typedef定义一个指向函数的指针类型FP,该函数的返回值为整型。
typedef int (*FP) (xxxx);//xx表示函数的形参
(2)用typedef定义一个10个元素的整型数组类型ARR,再用ARR定义一个10个元素的整型数组a
typedef int Arr[10];
Arr a;
10. char a[] 长度、元素问题
设变量定义为 char s[ ]=“hello\nworld\n”;,则数组s中有______个元素 13个元素 算上’\0’
strlen(s) 还是12
11. 指向字符串指针输出问题
char s[ ]="hello\nworld\n", *p=s;
printf("%c", *(p+10)); //是d *(p+11)是直接输出换行
printf("%c", *p+1); //输出是 i *p先执行 然后取到 h h+1就是 i
printf("%s", p); //hello 这里p换成s也是一样的输出结果
//world
12. 按位与& 按位或| 按位异或^ 按位取反 !
=== 1. and(&)运算 ===
and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数.
相同位的两个数字都为1,则为1;若有一个不为1,则为0。
00111
11100
(&或者and)
00100
=== 2. or(|)运算 ===
or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
相同位只要一个为1即为1。
00111
11100
(|或者or)
11111
=== 3. xor(^)运算 ===
异或的符号是⊕。
xor运算通常用于对二进制的特定一位进行取反操作,因为异或可以这样定义:0和1异或0都不变,异或1则取反。
xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520,于是她就明白了我的企图。
相同位不同则为1,相同则为0。 (谐音记法 异 1)
00111
11100
11011
4.~取反就是如果是00111,则变为11000
13. getchar()
getchar函数的返回值是用户输入的第一个字符的ASCII码
void main()
{ char c;
for(c=getchar(); getchar()!=’#’; c=getchar())
putchar(c);
}
// for循环反复执行 表达式2,表达式3 getchar();每次读缓存区的下一个元素
输入12345# 输出13
14.局部变量 全局变量
#include <stdio.h>
int z; //默认是0
void p(int *x, int y)
{ ++*x; //指针所指的值+1
y--;
z=*x+y+z;
printf("%d, %d, %d#", *x, y, z);
}
void main()
{ int x=1, y=5, z=9; //同名的话 局部变量优先级更高
p(&x, y);
printf("%d, %d, %d#", x, y, z);
}
输出 2, 4,6#2,5,9#
15.动态分配内存
struct dangdangtest
{ //xxxxxx
};
struct dangdangtest *p = (struct dangdangtest *)malloc(sizeof(struct dangdangtest)*1);
16.转义字符
printf("\n"); //结果 是 /n
printf("\n"); //换行