C笔记

标识符 做题时候注意 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个字节

img

%

%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"); //换行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值