易错选择题
1.关于C语言的说法
①关键字,函数名,标识符
解析:
A.C语言的关键字是非常重要的,既不能作为变量名,也不可以作为函数名
B.标识符的有有效长度最多包含63位
D.自定义的标识符见名知义,能随意定义,只是说见名之义就更好理解
故本题选C
②关于定义
解析:
A.字符变量可以再定义时赋初始值,如:char ch=A;
C.同一英文字母的大小写对应的ASCII码值不一样
D.转义字符以反斜杠 "\" 开头
故本题选B
2.合法常量
①
解析:
B 实型字面值常量有两种表示方式:小数形式和指数形式
小数形式:由最前面的确定正负号,数字0-9和小数点组成,不允许有其他符号;
指数形式;包括指数和尾数两个不可缺少的部分,
用符号E(e)分割;E(e)左边是尾数,为十进制整数或小数形式的实数,右边为指数,必须为十进制整数,表示乘以10的多少次方
so,选B
②
解析:
A中160是十进制数,-0xffff是十六进制数,011是八进制数,均合法
B中01a非法,因为a不是八进制数码
C中986,012非法,不能包含“,”,0668非法,因为8不是八进制数码
D中0x非法,因为后面没有有效的十六进制数码。
故选A
3.转义字符
①
本题选C
如想了解B选项退格,点此链接,在这篇文章有详解:
http://t.csdnimg.cn/fGZaU 错题->4.转义字符
②
看此段代码
int main() { printf("123\b2\n"); //"\b"表示退回一个光标 printf("\'\n"); //"\'"表示 ' printf("\\ \n"); //"\\"表示 \ printf("a\bre\' hi\' y\\\bou\n"); return 0; }
控制台输出:
4.scanf和printf类型
(1)scanf类型
先看代码
int main() { int a,b,c; scanf("a=%d b=%d c=%d",&a,&b,&c); printf("%d %d %d",a,b,c); return 0; }
若想给a输入123,给b输入456,给c输入666,该怎么在控制台输入呢?
你是不是这样子输入? 123 456 666?
答案是不行的;
scanf函数,格式是怎样的,就要怎么输出
so,控制台输入:a=123 b=456 c=666.
(2)scanf和printf类型
解析:
A.printf输出的数据隐含右对齐
B.scanf和printf是C语言提供的输入和输出函数
D.printf 输出数据所占的宽度由系统决定
so,本题选C
(3)printf输出
看此段代码:
int main() { int a = 2, b = 5; printf("a=%%d b=%%d\n", a, b); return 0; }
解析:
C 语言中用 "%%" 打印输出字符 "%", 输出为 %d%d 两个普通字符
而不是格式控制符 "%d" 的含义
5.sizeof类型
在内存中存储字符时,除了要存储有效字符外,还要在最后存储一个’\0’作为结束标志;
通常利用字符数组来存字符串,如果是直接给数组赋值字符串,系统会自动存’\0’;
如果是将数组元素依次存储的话,需要将’\0’也作为一个元素给数组赋值。
so,本题选C
如果感兴趣,可以去看看这篇文章,关于strlen和sizeof的计算
http://t.csdnimg.cn/fGZaU ->重点题型1.->strlen和sizeof的计算
6.++与--
①后置++和后置--
先看此代码
int main() { int a = 5; if (a++ > 5) printf("%d\n", a); else printf("%d\n", a--); return 0; }
输出的结果是什么呢?
前置++:先使用,后+1;
后置--: 先使用,后-1;
(a++ > 5)先使用 ,5 !=5,不满足if循环
后+1, a=6;
进入else,输出a--,先使用, a=6,输出6,再-1.
②前置++和后置++
先看代码:
int main() { int a = 1, b = 2, c = 3; if (a++ == 1 && (++b == 3 || c++ == 3)) printf("a=%d b=%d c=%d\n", a, b, c); return 0; }
a,b,c分别输出什么?
后置++,先使用,后+1
前置++,先+1,后使用
a++,x先使用a=1
++b,2+1=3
||或表达式左边为真,右边不再执行
所以c=3
结果为:
7.逻辑表达式
(1)|| 运算
(2)&& 和 || 运算
下列说法是否正确?
对于逻辑表达式: a++ || b++, 设a的值为1,则求解表达式的值后,b的值会发生改变;
对于逻辑表达式: a++ && b++,设a的值为0,则求解表达式的值后,b的值会发生改变;
解析:
都不对.
对于逻辑表达式,其中b的值不会因为表达式的结果发生改变
(3)逻辑表达式运算
已知x=43,ch='A',y=0;则( x>=y && ch < 'B' && !y )
输出的结果是?
( (x >= y) && ( ch< ' B ' ) && ( !y ) )
43>0,为真 ' A '< 'B',为真 !为非的意思,非0为真
so,结果输出1
(4)!非
循环语句while( !E );中的表达式 !E等价于
E == 0;
(5)整体表达式
先看此代码
int main() { int a = 3, b = 1, c = 0; int ret = (a <= b <= c); printf("%d\n", ret); return 0; }
结果为 1,为什么呢?
(6)宏替换
先看此段代码
#define MOD(x,y) x%y int main() { int a = 13, b = 94; printf("%d\n", MOD(b, a + 4)); }
宏替换是直接替换的,所以这里替换后应该是b % a + 4,先算%后算+,也就是3+4得7
8.switch语句
switch( 表达式 )
{
case 1:
break;
}
9.continue
先看代码
int main() { int a = 0, s = 0; int i = 0; for (;;) { if (i == 3 || i == 5) continue; if (i == 6) break; i++; s += i; } printf("%d\n", s); return 0; }
continue:终止最近的循环中的当前迭代并立即开始下一次迭代;
因此当i=3时,终止此次循环并进行下一次循环,而这个过程中i的值一直未发生变化,所以会陷入死循环
10.while循环
执行次数①
先看此代码
int main() { int i = 0, x = 0; while (!x && i < 3) { x++; i++; } return 0; }
这段代码执行循环多少次?
第一轮x=0,i=0则!x即为!0=1,while(1)可以循环,所以第一轮可以运行
第二轮i=1 ,x=1,这个时候!x为!1=0,0与1,对或错,所以第二轮不运行
程序只执行一次
执行次数②continue
先看此代码
int main() { int i = 0; while (i < 10) { if (i < 1) continue; if (i == 5) break; i++; } return 0; }
while循环的次数是?
在C语言中continue和break都可以放在循环体中,
continue代表跳过后续语句直接进入下一轮循环,
而break代表跳出循环
so,本题答案为死循环
11.for循环
①关于for循环的说法
解析:
A,for循环常用于循环次数已知的循环中,但也可以用于循环次数未知的循环中(可以循环0次也可以死循环)
B,for循环是先判断表达式,根据表达式的值来决定是否循环
C,break的作用就是跳出循环的
②for循环和continue
先看此代码
int main() { int sum = 0, j = 0; for (j = 0; j < 6; j++) { if (j % 2)continue; sum++; } printf("%d\n", sum); return 0; }
输出什么?
解析:
执行次数③
若循环体 S 中不改变 和 n(n > 0) 的值,也不包含 continue 和 break 语。
循环语“for(i=0; i=n; i++)S;”中循环体 S 被执行的次数为多少?
答案为:n+1;
由for(初始化;条件判断;调整)
可知循环次数为0-n的次数,S被执行次数为n+1次
12.函数
①说明
函数若无返回值,则它一定无形参。请问这个说法是正确的吗?
不对 x
一个函数可以有参数,没有返回值;
可以没有参数,有返回值;
可以没参数,没返回值;
可以有参数,有返回值。
参数和返回值没有必然联系.
②函数传参
解析:
函数定义fun第一个参数为char类型,第二个为float数组类型。
选项A:“abc”属于字符串常量,与定义函数参数不匹配,所以A错误。
选项B:fun函数为void没有返回值,所以无法赋值给t,所以B错误。
选项C:第二个参数2.8通常编译器默认是double类型,后面加上f即为float类型,即2.8f。因此和定义函数参数类型不匹配,所以C错误。
选项D:字符型变量本质底层存储的还是数字(字符ASCII编码),所以数字传参也是没问题的。
故本题选D
13.数组
看此段代码
void main() { char ch[80] = "123abcdEFG*&"; int j; puts(ch); for (j = 0; ch[j] != '\0'; j++) if (ch[j] >= ' A' && ch[j] <= 'Z') ch[j] = ch[j] + 'e' - 'E'; puts(ch); }