定义变量时,我们使用了诸如 a、abc、mn123 这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用,这叫做标识符(Identifier)
标识符就是程序员自己起的名字,除了变量名,后面还会讲到函数名、宏名、结构体名等,它们都是标识符。不过,名字也不能随便起,要遵守规范;C语言规定,标识符只能由字母(A~Z, az)、数字(09)和下划线(_)组成,并且第一个字符必须是字母或下划线,不能是数字。
以下是合法的标识符:
a, x, x3, BOOK_1, sum5
以下是非法的标识符:
源程序 xxx.c 编译之后=> 目标程序 xxx.obj 连接之后=> 可执行程序=> xxx.exe
#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);对字符串进行输出
定义方法:#include <string.h>
常用的几个函数及功能:
strchr() 查找字符
stremp() 比较字符串
strstr() 在字符串中查找字符串 ,使用方法:strstr(“被查找字符串”, “需要查找的字符串”);
strcpy() 复制字符串
strlen() 返回字符串的长度
strcat() 连接字符串
strdup() 复制字符串到堆上
strcmp() 用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str <str2 ,则返回负数;若str1>str2,则返回正数
atoi 函数(在<stdlib.h>库文件中),是把字符串转换成整型数的一个函数
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
#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
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);
}
M左移三位 n=M<<3;
同理 右移 >>x x表示位数。左移运算是将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。 输入的n如果是10进制 先把n转换成2进制,然后再移位,移位之后值再转换成10进制传给n。
int main()
{
int a=10, b=0;
printf("%d",!!a); //1
printf("%d",!a); // 0
printf("%d",!b); // 1
printf("%d",!!b); //0
}
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
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
}
void f(int n)
{ if(n<3)
printf("%d", n);
else{
f(n/3); //第一次 相当于 f(5)
printf("%d", n