持续更新中......
第一点 scanf和printf的返回值
我们来看这个程序他会打印一些什么呢?是43吗?
# include <stdio.h>
int main(void)
{
printf("%d",printf("%d",printf("%d",printf("%d",43))));
return 0;
}
答案是43211.
因为printf("%d",43)打印出来是43.
printf("%d",printf("%d",43))这个打印出来是2,因为printf("%d",43)打印了两个数,返回值为2
由此类推,结果是43211.
scanf同理。
第二点 二维数组越界访问
# include <stdio.h>
int main(void)
{
int i = 0;
int j = 0;
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
printf("请输入您想查看的数字:");
scanf("%d %d",&i,&j);
printf("这里是arr[%d][%d] = %d\n",i,j,arr[i][j]);
return 0;
}
正常访问当然是没问题的,但是要注意下标,比如我想访问的数是1那么我就要输入0 0 .
arr[0][0]是第一行第一列为1.
但是我们的arr[3][3]有九个数,如果我输入0 8,想要去访问 9,这能行吗?
答案是可以的,arr[2][2] = arr[0][8] = 9.
ps:while(1)只是为了让我能够一直输入而不用重新调试,不想继续了可以输入#按回车或者点击Ctrl+c停止
为什么会这样呢?
因为虽然我们定义的是二维数组,有三行三列,但是数组在内存中都是连续存储的,所以0 8与2 2存储的数组地址是一样的,因此我们可以用arr[0][8]去访问arr[2][2]的值,都是9.
第三点 sizeof()和strlen()
# include <stdio.h>
# include <string.h>
int main(void)
{
char arr[] = "hello";
int i = sizeof(arr)/sizeof(arr[0]);//计算arr数组含有多少个字符
int j = strlen(arr);
printf("%d\n%d\n",i,j);
return 0;
}
当我们定义了一串字符串时,我们的结尾会自动添加一个\0作为字符串的结束。
而strlen返回的是\0前面的字符个数,sizeof则会返回包括\0的字符占用的字节大小
(注意1:strlen返回的是\0前面的字符个数,如果在字符串中间加一个\0那么就只会返回第一次\0出现前面的字符串个数,比如abc\0def,会返回的值为3而不是6)
(注意2:如果要直接打印sizeof()那么他返回的是以字节为单位的size_t类型的值,打印时要用%zd或%u或%lu)
第四点 putchar()和getchar()
1.getchar();
getchar的作用类似于scanf(“%c”,ch),要输入一个字符,然后又将这个字符作为返回值返回,不带参数,并且只能返回一个字符。
输入多个字符的时候只会返回第一个字符。
2.putchar
putchar(ch)有参数,它的参数可以是字符,常量,转义字符和表达式,当ch为int类型数据时会将其输出为其对应的ASCLL值中的字符。
第五点 逗号运算符
逗号的作用时分隔符和运算符,当他作为分隔符时,就是将他们分开,比如定义两个变量的时候用逗号将他们分开。
int input,i,j,k;
当逗号作为运算符的时候,它保证了被他分隔的表达式从左往右求值,先左后右下面的式子表示了,先对i递增然后再把递增后的i乘以520的值赋给j
i++,j = i*520;
第六点 for循环的顺序
在第一个for时会打印十个嘿嘿。
for语句的执行顺序是,1,2,4,3,2,4,3,2,4,(一直324,直到3执行过后不满足2的条件跳出循环)
for(i = 1 ; i <= 10 ; i++)
{
printf(“嘿嘿”);
}
for(表达式1;表达式2;表达式3)
{
执行4
}
而且for括号里面的条件可以省略但是两个;不可以省略
int i = 1;
for(;i <= 10;i++)
{
}
并且for循环里面的条件可以是多个表达式,用逗号运算符分开
for(i = 0,j = 1,k = 2;i <= 10;i++,j++)
{
}
第七点 递归和尾递归
(如果有误希望各位可以在评论区批评指正,感谢各位观看~)