int x = (1+2,5+7,3+4,7+8);逗号表达式的作用:表达式1,表达式2...表达式n; 整个逗号表达式的值是(表达式n)的值。所以x的值为7+8=15.
int x = 1+2 ,5+7,3+4,7+8;//x=3//int x = (1+2,5+7,3+4, 7+8 );//赋值的优先级>逗号运算符,所以x=15//
1,循环体的循环次数不同,while(++i)偱环i次;while(i++)循环i+1次
2,循环完后,不的值不同while(++i)执行完后, i=0;while(i++)执行完后 ,i=1;
因为在while终止时括号内的逻辑值为0;而i++在循体结束后又执行了一次加1运算;
最大的区别是 当 i 为 0 的时候。
while(++i) 能被执行
while(i++) 不能被执行
int a[3];a[0] = 0; a[1] = 1; a[2] = 2;int *p, *q;p = a;q = &a[2];则a[q - p] =a[2]=2q-p=(地址q-地址p)/(sizeof(int))=2
7.字符数组保存字符串,有结尾字符‘/0’,长度往往比单纯的字符多1个
8.作用域。static变量不会自动恢复(与auto区分)
前方高能!!!
int m=10;
const int n=20;
先说一下const对指针的影响。
①const int*p,指向const的指针,方向可变,值不可变;
→ 普通指针 int *ptr3 = &n; // 错误,常量的地址不能初始化普通指针("const int*”类型的值不能用于初始化"int*”类型的实体),常量地址只能赋值给常量指针
→ 只能把非const的数据地址赋给普通指针,否则通过指针就可改变const的值
const int * ptr4 = &n; // 正确,常量地址初始化常量指针
与其他两个不同的是,由于方向可变,定义和初始化可以分头行动
②int*const p,指针常量,方向不可变,值可变;
规则:个人理解+实操;定义的同时初始化,不可以分开
√:int*const p=&m
×:int* const p; p=&m//err
int *const p=&n;//err const int*”类型的值不能用于初始化“int *const”类型。说人话是,此时的指针值可以改变。而n是const常量,不可改变。所以错误
③const int *const p,只读,既不能改变方向,也不能改变值得大小。
规则:定义的同时初始化,不可以分开
int main() {int m = 10;const int n = 20;/*---------------------------------------------------------------------------*/const int *ptr1 = &m;int * const ptr2 = &m;*ptr1 = 3;//不可改变大小,第一处ptr2 = &n;//不可改变方向,第二处int *ptr3 = &n;// const不能赋给普通指针,第三处const int * ptr4 = &n;int * const ptr5;//排除法得出的第七处ptr5 = &m;// int*const p定义的同时初始化,第四处const int * const ptr6 = &m;*ptr6 = 5;//第五处ptr6 = &n;//第六处const int * ptr7;ptr7 = &m;/*---------------------------------------------------------------------------*/return 0;
关于下面程序的输出结果中,正确的是()#include <stdio.h>#include <string.h>int main(){int i,j;int src_len;int new_len;char src_str[100]="123456789";char new_str[]="abcd";int addr=2;src_len=strlen(src_str);//9, strlen取得是实际长度,不考虑'/0'new_len=strlen(new_str);4for(i=src_len-1;i>addr-1;i--){src_str[i+new_len]=src_str[i];// 数组下标从0开始,最容易忽略}for(i=0;i<new_len;i++)src_str[addr+i]=new_str[i];src_str[src_len+new_len]='\0'; //在字符串结尾添加'\0'printf("src_str=%s\n",src_str);return 0;}A src_str=12 abcd 3456789B src_str=123abcd456789C src_str=1abcd23456789D src_str=1234abcd56789
填空部分
1. 指针传递
int fun( int *x ,int n ) {if (n == 0) return *(x + 1);else {*x += fun(x + 1, n - 1);return *x;}// 指针传递 , 数组a已经重组a[]={13,8,4,2,1}int main( ){int a[] = { 5,4,3,2,1 }, * p[] = { a + 3,a + 2,a + 1,a }, ** q = p;fun( a , 3);printf("%d\n", *(p[1] + 1));// &a[3]=2这里还有个误区。p[]是指针数组,储存着a[]的地址。√:( p[1] + 1)=&a[2]+1=a[3]=2;×:( p[1] + 1)=p[2] 思路和操作都是错的√: ( q[1]+ 1 )=&p[2]=&(&a[1])
printf("%d\n", **(q + 3));// q[3]=&a[0]=13printf("%d", *(p[1] + 1) + **(q + 3));//15return 0;}
2 .scanf格式控制中,*%d使当前输入不被赋予相应变量
③*%d%d%d。*之后的所有赋值失效(a=0,b=0,c=0;输入1 2 3)
1.*%d%d%d→0 0 0
2.%d*%d%d
3.%d%d*%d
①%*d,忽略本身;
scanf("%d%*d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
输入:12 34 56
输出:a=12,b=56,c=0
相当于:忽略掉第二个输入34(它本身)
scanf("%d%d%*d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
输入:12 34 56
输出:a=12,b=34,c=0
相当于:忽略掉第三个输入56(它本身)
②%.*d,忽略下一个输入
scanf("%.*d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
输入:12 34 56
输出:a=12,b=56,c=0
相当于:忽略掉第二个输入34(它的下一个)
所以a和第一个输入匹配,b和第三个输入匹配,
中间那个输入被忽略了,所以c也就没有匹配上。
若输入“1空格1”,则以下程序的输出结果是(),(),()。int x = 2;void fun(int p){int x = 4,y = 0,z = 0,k;k = x++,y++,++z;x +=(y++,++y,k+ y++ +p);printf("%d\n",x);//15printf("%d\n",y);//4}int main( ){int a = 3;scanf(" %*d%d ",&x,&a);// 此处x=1,a赋值失败a=3fun(a); x+=a++ ;// 与while中的自加一样,先赋值,后自加printf("%d\n",x);//4
// printf("%d\n", a);// a=4 ;return 0;}
3.①if语句中,若只执行一条语句,则没必要写大括号
②两小时的教训!!if-else if-else,如果if为真值,则跳过else-if和else,执行语句
输入"2022 jyzy jia you<回车>"char a = 1, ch;int w = 1;while ((ch = getchar( )) != '\n'){if (ch == ' ')w = 0;// ①的第一处体现else if (w == 0){w = 1;if (a % 3 != 0 && (ch >= 'a' && ch <= 'z'))ch = ch - 'a' + 'A';// ①的第二处体现a++;}putchar(ch);}结果为 2022 Jyzy Jia you
三.编程题
#include<stdio.h>
int main()
{
int x = 0;
scanf("%d\n", &x);
int a[101] = { 0 };for (int i = 0; i < x; i++)
{
int t;
scanf("%d", &t);
a[t]++;
}
①
int i = 1,j=2;
for (i; j < 101; j++)
{
if (a[i] < a[j])
{
i = j;
}}
printf("%d", i);②
int max=1,j=2;
for (max; j < 101; j++)
{
if (a[max] < a[j]){
max = j;
}
}
return 0;
}