初识C
(1)程序与数据一样,共同存储在存储器中。当程序要运行时,当前准备运行的指令从内存被调入CPU中,由CPU处理这条指令。这种将程序与数据共同存储的思想就是目前绝大多数计算机采用的(A)模型的存储程序概念
A.冯•诺伊曼 B.阿兰•图灵 C.克劳德•香农 D.西蒙•克雷
(2)整型除法,得到的是整形,所以对于:
如果在C语言中先除9会带来较大误差
一般进行*1.0或加.0来转浮点型,或者加括号进行强转操作
(3)负数的取余操作:
求余定义:a%b = a - (a/b)*b
负数求余:被除数的绝对值与除数绝对值取余的值即为余数绝对值,余数符号与被除数一致。、
例:-10%3=-1;10%(-3)=1;
(4)注意题干选项中的输入输出格式和顺序
(5)运算符优先顺序记忆(结合性):
C++ 运算符优先级列表 - IAmAProgrammer - 博客园
(6)移位运算符:
(7)哪一项与其他代码不等价
1>switch语句:break有无,default有无(有时没有也能等价,在语句外赋值)
在有break的情况下,与顺序无关
2>ifelse语句:注意赋值号与等号的区别
在嵌套使用if语句时,C语言规定else总是和之前与其最近的且不带else的if配对
int main(void)
{
int a = 2, b = -1, c = 2;
if(a < b)
if(b < 0)
c = 0;
else c++;
printf("%d\n",c);
return 0;
}
1.else与 if(b < 0) 配对(与其最近的且不带else的if配对)一起成为if(a < b)内的判定形成嵌套调用,由于第一个if语句没有进入,c的值未被修改
2.如果第一个if语句后加上分号,c的值就会被改变
(8)对于变量定义:int a, b = 0;
定义了a赋一个随机值,定义变量b赋值0
(9)给结果逆推变量取值:
在执行以下程序时,为使输出结果为:t=4,则给a和b输入的值应满足的条件是 C
int main(void)
{
int a,b,s,t;
scanf("%d,%d",&a,&b);
s = 1; t = 1;
if(a > 0) s = s + 1;
if(a > b) t = s + t;
else if(a == b) t = 5;
else t = 2 * s;
printf("t=%d\n",t);
return 0;
}
A.a>b B.a<b<0 C.0<a<b D.0>a>b
(10) break 语句只能用在循环体内和 switch 语句体内
函数
(11) 以下关于函数叙述中,错误的是(B)。
A.函数未被调用时,系统将不为形参分配内存单元
B.实参与形参的个数必须相等,且实参与形参的类型必须对应一致
可以进行类型强转
形参应与对应的实参类型一致??
C.当形参是变量时,实参可以是变量、常量或表达式
D.如函数调用时,实参与形参都为变量,则这两个变量不可能占用同一内存空间
(12)实参与其对应的形参各占用独立的存储单元
(13)在函数调用Func(exp1 , exp2+exp3 , exp4*exp5)
中,实参的数量是 ()
3个,表达式需要算出值后再代入函数,所以只有三个实参
(14)形参无法改变实参的数值,除非传到函数的是指针变量进行赋值
(15)以下程序的运行结果是( )。
int x = 5, y = 6;
void incxy( )
{
x++;
y++;
}
int main(void )
{
int x = 3;
incxy( );
printf("%d, %d\n", x, y);
return 0;
}
A.3, 6 B.4, 7 C.3, 7 D.6, 7
局部变量对全局变量的遮蔽作用:
类似排异反应,函数优先调用函数内部定义的参数,当全局变量名与局部变量名相同时,优先调用局部变量,所以改代码x的值并未发生改变,所以为3
递归(初阶过程理解)
(16)对于以下递归函数f,调用 f(3) 的返回值是( )。
int f(int n)
{
if (n != 0){
return f(n-1) + n;
}else{
return n;
}
}
1.首先 3 代入函数进行判定,执行 f(3-1) + 3语句
2.所以 2 代入函数进行判定,执行f(2-1) + 2语句
3.接着 1 代入函数进行判定,执行f(1-1) + 1语句
4.最后 0 代入函数进行判定,执行return 0语句
5.回到第三步,return 1
6.回到第二步,return 1 + 2
7.回到第一步,return 3 + 3
8.所以结果为 6
内存
(17)数组占内存为申请变量个数乘类型所占内存
二维数组
(18)可以省略列但不能省略行,即a[5][ ]可,但a[ ][5]不行
指针
(19)下列程序的输出结果是( )。
# include <stdio.h>
int main(void)
{
int a[10] = {0,1,2,3,4,5,6,7,8,9}, *p = a+3;
printf("%d", p[2]);
return 0;
}
指针P可以类似定位一个新的数组起点,类似新建一个数组
*p = a+3后 p 指向的 a数组的第四个元素的地址为首地址,再导入数组下标进行访问
字符串
(20)scanf("%s", &pup[0].name) 错误 定义name本来就是地址,字符串首地址,无需取地址
结构体
(21)结构体定义,在没有typedef的情况下,类型名为sturct + 自定义名 + 自定义名
(22)设有如下定义,则对data
中的a
成员的正确引用是()。
struct sk{
int a;
double b;
} data, *p = &data;
A.(*p).data.a B.(*p).a C.p->data.a D.p.data.a
(*p) = data是因为取了地址,而之前的判断题中无取地址符,所以对于结构体指针变量只能用箭头访问成员,只有定义的结构体变量名才用 . 进行访问
而数组可以用p[i]访问
(23)结构体数组
若有下列定义,则以下不合法的表达式是(D )
struct student{
int num;
int age;
};
struct student stu[3] = {{101, 20}, {102, 19}, {103, 20}}, *p = stu;
A.(p++)->num B.p++ C.(*p).num D.p = &stu.age
P指向的是结构体数组首个结构体的地址,所以解引用即为stu[0],可以通过.进行成员访问
而stu虽然代表结构体数组首个结构体地址,但需要下标才能进行合法访问
文件
(24)缓冲文件系统的文件缓冲区位于(内存数据区中)