暂时欠的:2
18左值(left-value lvalue)和右值(right-value rvalue).左值必须是可改变的。比如(a++) 是先将变量 a 的值(5)做为整个表达式的值返回,再将 a 自增 1(类似于 a = a + 1)。
所以这里 ++(a++); 相当于 ++(5), a = a + 1;
那当然要报错啦,5 是一个常量,当然不能给你 5 = 5 + 1 咯~
数组名是一个地址,不是左值,是右值,是常量。左值是可变的,变量,如int i=10;
17指针和数组相同点很多,可以混用。数组的数组名其实可以看作一个指针
#include<stdio.h>
#include<string.h>
int main()
{
/* int a;
int *p=&a;
printf("请输入一个整数:");
scanf("%d",&a);
printf("a=%d\n",a);
printf("请重新输入一个整数:");
scanf("%d",p); //p的地址就是&a,然后又赋值给a
printf("a=%d\n",a);*/
/* char str[128];
printf("请输入鱼C的域名:");
scanf("%s",&str);//有没有& 号都可以 ,数组名就是一个地址
// printf(“鱼C的域名是:%s\n”,str);
printf("str 的地址是:%p\n",str);
printf("str 的地址是:%p\n",&str[0]);*/
//数组名其实和数组第一个元素的地址 一样
/* char a[]=“FishC”;
int b[5]={1,2,3,4,5};
float c[5]={1.1,2.2,3.3,4.4,5.5};
double d[5]={1.1,2.2,3.3,4.4,5.5};/
//char p=a;
// printf("p=%c,(p+1)=%c,(p+2)=%c\n",p,(p+1),(p+2));
// int p=b;
// printf("p=%d,(p+1)=%d,(p+2)=%d\n",p,(p+1),*(p+2));
// float p=c;
// printf("p=%0.1f,(p+1)=%0.1f,(p+2)=%0.2f\n",p,(p+1),*(p+2));
// double p=d;
// printf("p=%0.1f,(p+1)=%0.1f,(p+2)=%0.2f\n",p,(p+1),*(p+2));
// printf("b=%d,(b+1)=%d,(b+2)=%d\n",b,(b+1),(b+2));
//数组和指针可以混用,很多相同
/* printf(“a[0]->%p,a[1]->%p,a[2]->%p\n”,&a[0],&a[1],&a[2]);
printf(“b[0]->%p,b[1]->%p,b[2]->%p\n”,&b[0],&b[1],&b[2]);
printf(“c[0]->%p,c[1]->%p,c[2]->%p\n”,&c[0],&c[1],&c[2]);
printf(“d[0]->%p,d[1]->%p,d[2]->%p\n”,&d[0],&d[1],&d[2]);
*/
// char str[]=“I love FishC,com”;
char *str=“I love FishC,com”; //这和上面一句结果一样数组和指针可以混用,很多相同
int i,length;
length =strlen(str);
for(i=0;i<length;i++)
{
printf("%c",str[i]);
}
return 0;
}
16指针就好像现实生活中的地址和值。就好像寻找现实生活中一个人,得先找到其所在地址(地址),再找到这个人(值)
最重要指针:int p[3]; //首先从P 处开始,先与[]结合,因为其优先级比高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型。
#include<stdio.h>
int main()
{
/* int *a;
*a=123;
printf("%d\n",a); */ //野生指针不行,没给地址就会随机地址,有时会覆盖原有数据地址,会出错
char a='F';
int f=123;
char *pa=&a;
int *pb=&f;
// printf(“a=%p\n”,&pa); //求地址
printf(“a=%c\n”,*pa); //求值的
printf("f=%d\n",*pb); //%c出错了 %d才对
*pa='C';
*pb+=1;
printf("now,a=%c\n",*pa);
printf("now,a=%d\n",*pb);
printf("sizeof pa=%d\n",sizeof(pa));
printf("sizeof pa=%d\n",sizeof(pb)); //怪不得结果一样pb写成pa了
printf("the addr of a is:%p\n",pa);
printf("the addr of a is:%p\n",pb);
return 0;
}
15二维数组
#include<stdio.h>
int main()
{
int a[4][5]={
{80,92,85,86,99},
{78,65,89,78,99},
{67,78,76,89,99},
{88,68,98,90,99}};
//int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
//int a[3][]={1,2,3,4,5,6,7,8,9,10,11,12}; //这样过不了 服了
// int a[3][4]={{1,2,3,4},
// {5,6,7,8}
// ,{9,10,11,12}};
// int a[3][4]={[0][0]=1,[1][1]=2,[2][2]=3}; //dev 不支持c99
int i,j;
/* for(i=0;i<4;i++)
{
for(j=0;j<5;j++) //把j<4写成i,怪不得无限循环
{
printf("%d “,a[i][j]);
}
printf(”\n");
}*/
for(i=0;i<5;i++)
{
for(j=0;j<4;j++) //行列转换一下
{
printf("%d ",a[j][i]);
}
printf("\n");
}
return 0;
}
14字符串
空字符是一个字符,占1字节
#include<stdio.h>
#include<string.h>
int main()
{
/* char str[]=“I love FishC.com!”;
printf("sizeof str=%d\n",sizeof(str));
printf("strlen str=%d\n",strlen(str));
*/
/* char str1[]=“Origina String”;
char str2[]=“New String”;
char str3[100];
strcpy(str1,str2);//str2复制给1
strcpy(str3,"Copy Succesful");
printf("str1:%s\n",str1);
printf("str1:%s\n",str2);
printf("str1:%s\n",str3);
*/
/* char str1[] = “To be or not to be”;
char str2[40];
char str3[40];
strncpy(str2, str1, sizeof(str2));
strncpy(str3, str2, 5);
// str3[5] = '\0';
printf("%s\n", str1);
printf("%s\n", str2);
printf("%s\n", str3);
*/
/* char str1[]=“l love”;
char str2[]=“FishC!.com”;
strcat(str1," "); //单引号出错
strcat(str1,str2);
// strncat(str1,str2,1);
printf(“str=%s\n,str2=%s\n”,str1,str2);*/
char str1[]="FishC!.com!";
char str2[]="FishC!.com!";
if(!strcmp(str1,str2)) //相同会返回0 ,所以要非 !
{
printf("两个字符串完全一致!\n");
}
else
{
printf("两个字符串存在差异!\n");
}
return 0;
}
13#include<stdio.h>
//#define NUM 10
int main()
{
/* int a[10];
int i;
for( i=0;i<10;i++)
{
a[i]=i;
}
printf("%d\n",i); */
/* int s[NUM];
int i,sum=0;
for(i=0;i<10;i++)
{
printf("请输入第%i位同学的成绩:",i+1);//%d %i 在printf一样的
scanf("%d",&s[i]);
sum+=s[i];
}
printf("成绩录入完毕,该次考试的平均分是:%.2f\n",(double)sum/NUM);
*/
// int a[10]={1,2,3,4,5,6,7,8,9,0};
//int a[]={1,2,3,4,5,6,7,8,9,0};
// int a[10]={0};
// int a[10];//未初始化 会出现乱码
// int a[10]={1,2,3,4,5};
// int a[10]={[3]=3,[5]=5,[8]=8}; //dev这里用不了c99标准
/* int i;
for(i=0;i<10;i++)
{
printf("%d\n",a[i]);
}
printf("%d\n",sizeof(a));*/
/* int n,i;
printf(“请您输入字符的个数:”);
scanf("%d",&n);
char a[n+1]; //dev不支持c99
printf("请开始输入字符:");
getchar();
for(i=0;i<n;i++)
{
scanf("%c".&a[i]);
}
a[n]='\0';
printf("你输入的字符是:%s\n",a);*/
int a[10],i;
for(i=0;i<=10;i++)
{
a[i]=i;
}
a[10]=111; //我的天 数组越界了也可以 ,看编译器的
for(i=0;i<=10;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
12#include<stdio.h>
int main()
{
/* int i=5,j;
j=++i;
printf(“i=%d,j=%d\n”,i,j);
i=5;
j=i++;
printf("i=%d,j=%d\n",i,j);*/
//结果是 i=6,j=6;++i是先运算再赋值;i++是先赋值再运算
// i=6,j=5;
//goto语句少用
int i=5;
while(i++)
{
if(i>10)
{
goto A;
}
}
A: printf(“Here,i=%d\n”,i);
return 0;
//i=11
}
11// int i,j;
// for (i=0;i<10;i++)
// {
// for(j=0;j<10;j++)
// {
// if(j3)
// {
// break;
// }
// }
// if(j3)
// {
// break;
// }
// }
// printf(“i=%d,j=%d\n”,i,j);
// int ch;
// while((ch=getchar()) !=’\n’)
// {
// if(ch==‘C’)
// {
// continue;
// }
// putchar(ch);
// }
int i;
for(i=0;i<100;i++)
{
if(i%2)
{
break;
//continue;
}
}
return 0;
}
10#include<stdio.h>
#include <stdbool.h>
int main()
{
// int count;
//
// for (;😉
// {
// printf(“FishC!\n”);
// // count++;
// }
// int i,num;
// _Bool flag=1;
//
// printf(“请输入一个素数:”);
// scanf("%d",&num);
//
// for(i=2;i<num/2;i++)
// {
// if(num%i==0)
// {
// flag=0;
// }
// }
// if(flag)
// {
// printf("%d是一个素数!\n",num);
// }
// else
// {
// printf("%d不是一个素数!\n",num);
// }
//int i,j;
// for (int i=0,j=10;i<j;i++,j–)
// {
// // printf("%d,%d\n",i,j);
// printf("%d\n",i);
//
// }
// printf("%d\n",i); for循环体里面的i,出了循环得重新定义
// int i,j;
// for (i=0;i<3;i++)
// {
// for(j=0;j<3;j++)
// {
// printf(“i=%d,j=%d\n”,i,j);
// }
// }
//99乘法表
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
{
printf("%d*%d=%-2d ",i,j,i*j);
}
printf("\n");
}
return 0;
}
9while和do while
#include<stdio.h>
int main()
{
// int i=1;
// int sum=0;
// while(i<=100)
// {
// sum=sum+i;
// i=i+1;
// }
// printf("%d",sum);
int count=0;
printf("请输入一行英文字符:");
while(getchar()!='\n')
{
count=count +1;
}
printf("你总共输入了%d个字符!\n",count);
return 0;
}
8#include<stdio.h>
int main()
{
//switch循环
// char ch;
// printf(“请输入你的成绩:”);
// scanf("%c",&ch);
//
// switch(ch)
// {
// case’A’:printf(“你的成绩在90分以上!\n”);break;
// case’B’:printf(“你的成绩在80~90分以上!\n”);break;
// case’C’:printf(“你的成绩在70~80分以上!\n”);break;
// case’D’:printf(“你的成绩在60~70分以上!\n”);break;
// case’E’:printf(“你的成绩在60分以上!\n”);break;
// default:printf(“请输入有效成绩评级!”);
//
//
//
//
//
// }
//嵌套if else
// int a,b;
// printf(“请输入两个数:”);
// scanf("%d %d",&a,&b);
//
// if(a!=b)
// {
// if(a>b)
// {
// printf("%d >%d",a,b);
// }
// else
// {
// printf("%d<%d",a,b);
//
// }
//
// }
// else
// {
// printf("%d=%d",a,b);
// }
//悬挂else else会算最近的if
// char isRain,isFree;
// printf(“是否有空?(Y/N)”);
// scanf("%c",&isFree);
//
// printf(“是否下雨?(Y/N)”);
// scanf("%c",&isRain);
//
// getchar();
//
// if(isFree == ‘Y’)//没想到编译不过是双引号问题
// {
// if(isRain==‘Y’)
// {
// printf(“记得带伞\n”);
// }
// }
// else
// {
// printf(“女神没空”);
// }
//=和==
char hasBF;
printf("小花你有男朋友吗?(Y/N)");
scanf("%c",&hasBF);
if(hasBF =='Y')
{
printf("那祝福你们咯!");
}
else
{
printf("那我们在一起");
}
return 0;
}
7没想到要加&才不会报错
#include<stdio.h>
int main()
{
// int i;
// printf(“您老贵庚:”);
// scanf("%d",&i);
// if(i>=18)
// {
// printf(“进门左拐!”);
// }
// else
// {
// printf(“不好意思”);
// }
int i;
printf("请输入你的成绩:");
scanf("%d",&i);//没想到少了&
if(i>90)
{
printf("A");
}
else if(i>=80 &&i<=90){
printf("B");
}
else if(i>=70 &&i<=80){
printf("C");
}
else if(i>=60 &&i<=70){
printf("D");
}
else
{
printf("E");
}
return 0;
}
6短路求值
#include<stdio.h>
int main()
{
// int a=5,b=3;
// printf("%d\n",1<2);//1
// printf("%d\n",a>b);//1
// printf("%d\n",a<=b+1); //0
// printf("%d\n",‘a’+‘b’<=‘c’);//0
// printf("%d\n",(a=3)>(b=5));//0
//逻辑表达式
// printf("%d\n",3>1&& 1<2);
// printf("%d\n",3+1|| 2==0);
// printf("%d\n",!(a+b));
// printf("%d\n",!0+1<1||!(3+4));
// printf("%d\n",‘a’-‘b’&&‘c’);
//短路求值
// int a=3,b=3; //a=0,b=3he a=1,b=3
int a,b;
(a = 0) &&(b= 5);
printf(“a=%d,b=%d\n”,a,b); //a=0,b=0
(a = 1) ||(b = 5);
printf("a=%d,b=%d\n",a,b);//a=1,b=0
}
5强制转换前面加(int)类型
#include<stdio.h>
#include<math.h>
int main()
{
// int i,j,k;
// i=1+2;
// j=1+2*3;
// k=i+j±1+pow(2,3);
// printf("%d %d %d",i,j,k);
// return 0;
printf("整数:%d",1+2.0);
printf("整数:%d",1+(int)2.0);//=3
printf("整数:%d",1+(int)(1+0.8)); //等于2
printf("整数:%f",1+2.0);//=3
}
4求余%,两个操作数得是整数,不能5.0%3.0。单目(±)和双目,是指有一个操作数,两个操作数。
运算符和括号把操作数连接起来叫表达式
3char取值范围不能溢出
#include<stdio.h>
int main()
{
// printf(“hello world”);
// char a=‘C’;
//printf("%c=%d",a,a);
// int a=70,b=105,c=115,d=104,e=99;
// printf("%c%c%c%c%c\n",a,b,c,d,e);
// unsigned char height =170;
// printf(“小甲鱼身高是%d厘米”,height);
// char a[5]={‘f’,‘i’,‘s’,‘h’,‘c’};
// char a[]={‘f’,‘i’,‘s’,‘h’,‘c’};
char a[5]=“fishc”; //会出错
printf("%s\n",a);
printf("hello\n");
return 0;
}
2原来学语言,这样学的,学完后写会框架,引擎,程序,中间件,驱动,解释器才行(学C学C++、学Java学习目标应该是自己写libevent自己写玩具版unreal自己写模板程序自己搞类似spring的中间件自己写设备驱动操作系统自己实现TCP协议栈自己写DSL解释器)
1API相当传输数据用的数据线
c函数
1strlen函数:计算的是字符串str的长度,从字符的首地址开始遍历,以 ‘\0’ 为结束标志,然后将计算的长度返回,计算的长度并不包含’\0’。
代码#include <stdio.h>
#include <string.h>
int main()
{
/* char arr[10] = “abcde”;
int num = strlen(arr);
printf(“数组arr的长度为:%d\n”, num);//strlen函数:计算的是字符串str的长度,从字符的首地址开始遍历,以 ‘\0’ 为结束标志,然后将计算的长度返回,计算的长度并不包含’\0’
*/
char arr[] = {'a','b','c','d','e'};
int num = strlen(arr);
printf("数组arr的长度:%d\n", num);
//好奇怪,csdn结果是19,dev结果是5
return 0;
}
疑问:
1dev创建项目编译失败
2第九第二代码不是很懂
3第10(99乘法表)
4 16的指针里面int 和char类型的sizeof 一样,在dev里面都是8