C语言

C语言易错

1
已有声明“int x,a=3,b=2;”则执行赋值语句“x=a>b++?a++:b++;”后,变量x,a,b值分别为
A 343
B 334
C 333
D 434
选择A

12
单选(3分)
对于以下代码:
1.int i;
2.for ( i=0; i<10; i++)
3. printf("%d", i);
for循环后,i的值是多少?10

填空(3分)
假设sizeof(int)的值为4,对数组定义:
1.int a[3][6];
则sizeof( a[0] )的值为__24____。

7
填空(3分)
下列代码段的输出结果是:3#Zhe#
1.char s[]=“Zhejiang”;
2.s[strlen(s)/2-1]=0;
3.printf("%lu#%s#",strlen(s),s);

2单选(3分)
若变量已正确定义,执行
scanf("%d%c%f", &op1, &op, &op2);
输入什么之后,op1的值为1,op的值为’*’,op2的值为2.0
A.
1 *2.

B.
1* 2.

C.
1 * 2

D.
1 * 2.0

1.一个tab占8个字节
2.3/43与3/(43)结果不同。因此要注意符号常量。

1#include<stdio.h>
int main()
{int i=7;
if(i<=6)
printf(“hello\n”);
;
else
printf(“bybe-bybe\n”);

}
改程序错误,(else不可以单独使用,必须与它上一个if配对,即else其上面必须为if语句)

2
#include<stdio.h>
int main()
{int x=5;
if(x–<5)
printf("%d",x);
else
printf("%d",x++);

}

解释:x-- 是自减,而且是后(缀)减减。按规定,在表达式里不减1,表达式里用x 的原值,出了表达式以后才自减。
if (x--<5) {} 条件判断时 用if (x<5), 执行后面语句时 用 x=x-1.

x++ 后(缀)加。按规定,在表达式里不加1,表达式里用x 的原值,出了表达式以后才自增1。
int x=1;
printf("%d",x++);
打印 1, 再来一句 printf("%d",x); 却打印出 2。

3 #include<stdio.h>
int main()
{
int k;
while(k!=0) k=k-1;
printf("%d",k);
}

若定义一个变量(为int类型)且没有给它一个初始值,则系统会在最后默认给它一个值0
不同类型赋值是不一样的,

运行时printf(“请输入两个正整数 n,m:”);要求输入两个正整数(有符号)
1当输入状态为英文时 其结果为正确
2当输入状态为中文则 (you can try)

数组5.1
#include<stdio.h>
#define N 5
int main()
{
double a[N];
double sum=0,max=0,min=0;
int i;
for(i=0;i<N;i++)
{printf(“请第%d个评委输入分数: “,i//i++);
//for(i=0;i<=N;i++)
//printf(“piease input:”);
//scanf(“a[i]=%f”,&a[i]);
scanf(”%lf”,&a[i]);
sum=sum+a[i];sum=a[0]+a[1]+a[2]+a[3]+a[4];
if(a[i]>max) max=a[i];
if(a[i]<min) min=a[i];
// if(a[i]<a[i+1]) min=a[i];
//if(a[i]>a[i+1]) max=a[i];
}
printf(“最终得分: %4.1lf\n”,(sum-max-min)/(N-2));
return 0;
}
例如当i=5时,i+1=6,然而并没有a[6]
此时输入的只有i=0,2,4
定义数组时,其表达式定为常量或字符型。要是需要变量则如上面表示方法写(符号变量)
错在fo后面语句没加括号只对后面紧跟的一条语句有用
这样写不简洁且当N变化时其不随N变化,就显得有局限性
若不定义sum=0,在运算时其结果为0
补充: [Error] ld returned 1 exit status
出现情况是1,是你的程序已经在运行,此时关闭原来的程序即可
2,你的机器上有杀毒软件在运行,其阻止了程序运行
3,检查函数名与定义是否一致

数组5.1
#include<stdio.h>
#define N 5
int main()
{
double a[N];
double sum=0,max=0,min=0;
int i;
for(i=0;i<N;i++)
{printf(“请第%d个评委输入分数: “,i//i++);
//for(i=0;i<=N;i++)
//printf(“piease input:”);
//scanf(“a[i]=%f”,&a[i]);
scanf(”%lf”,&a[i]);
sum=sum+a[i];sum=a[0]+a[1]+a[2]+a[3]+a[4];
if(a[i]>max) max=a[i];
if(a[i]<min) min=a[i];
// if(a[i]<a[i+1]) min=a[i];
//if(a[i]>a[i+1]) max=a[i];
}
printf(“最终得分: %4.1lf\n”,(sum-max-min)/(N-2));
return 0;
}
例如当i=5时,i+1=6,然而并没有a[6]
此时输入的只有i=0,2,4
定义数组时,其表达式定为常量或字符型。要是需要变量则如上面表示方法写(符号变量)
错在fo后面语句没加括号只对后面紧跟的一条语句有用
这样写不简洁且当N变化时其不随N变化,就显得有局限性
若不定义sum=0,在运算时其结果为0
补充: [Error] ld returned 1 exit status
出现情况是1,是你的程序已经在运行,此时关闭原来的程序即可
2,你的机器上有杀毒软件在运行,其阻止了程序运行
3,检查函数名与定义是否一致

9.以下4个选项中,不能看作一条语句的是( )
A. {;} B.a=0,b=0,c=0; C.a=3; D.if(b==0) m=1;n=2;

答案:D 在C语言中,语句可以分为五类
1.表达式语句;
2.函数调用语句;
3.控制语句;
①if( )~else 条件语句
②for( )~ 循环语句
③while( )~ 循环语句
④do~while( ) 循环语句
⑤continue 结束本次循环语句
⑥break 中止执行switch或循环语句
⑦switch 多分支选择语句
⑧goto 转向语句
⑨return 从函数返回语句

4.复合语句;
5.空语句。

13.有以下定义
#include
char a[10],*b=a;
不能给数组a输入字符串的语句是( )
A. gets(a) B. gets(a[0]) C. gets(&a[0]) D. gets(b)

B

14.有以下程序
#define f(x) x*x
main( )
{ int i;
i=f(4+4)/f(2+2);
printf(“%d\n”,i);
} 执行后输出结果是( )
A. 28 B. 22 C. 16 D.4

A f(4+4)=24 f(2+2)=8
22.以下定义语句中,错误的是( )
A. int a[]={1,2}; B. char *a[3]; C. char s[10]=”test”; D. int n=5,a[n];

D有一种错误 例如char s[10];s[10]=”test”;是错误的但若是指针则是对的

3、设有说明语句:char a= ‘\123abc’;则变量a ( )
A) 包含7个字符 B) 包含6个字符 C) 包含5个字符 D) 包含4个字符

D,\o :\oo;\ooo其中o代表一个八进制数。以上形式为一种转义字符
\xh[h…]其中h(有三个数)代表一个十六进制数。以上心声为一种转义字符
补充:char a[]="\abc";为3个字符
char a[]="\xabczzz";为4个字符;
char a[]="\xabc";为1个字符

7、若有声明语句char ch=’a’,*pc=&ch;以下语句中,有语法错误的是 。
A.(*pc)++ B.ch+=-‘a’+’A’; C.toupper(ch)=ch; D.ch++;
C

9、以下数组声明语句中正确的是    。
  A.int a,a[n]; B.int a[ ];
C. int a[2][3]={{1},{2},{3}}; D.int a[ ][3]={{1},{2},{3}};
C

17、设x、y、t均为int型变量,则执行语句:x=y=3;t=++x||++y;后y的值为( )
A)不定值 B)4 C)3 D)1
C

3.一个tab占8个字节

20

  int m[3][4]={0};
  printf("%d\n",m);//6422048 第0行
  printf("%d\n",m+1);//6422064 第一行
  printf("%d\n",m[2]);//64220580
  printf("%d\n",&m[2][0]); //6422080
  printf("9999999999999999999999999\n");
  printf("%d\n",sizeof(m));//整个数组大小 48=12*4
  //m+1相当于&m[1],无论m[][]的行数和列数怎么改变,都是8
  printf("%d\n",sizeof(m+1));//8
  printf("%d\n",sizeof(&m[1]));//8  
  printf("%d\n",sizeof(m[1]));//16

  printf("%d\n",sizeof(m+2));//8
  printf("%d\n",sizeof(m+3));//8

21

int main()
{char a[9]="40\040\ 0";
printf("%d",strlen(a));答案为5,printf(“%d”,sizeof(a));答案(数组【】的数字为几就是几)9
对于二维数组指针进行实参与形参的传递
Int a[2][3];                             int a[2][3];
Example(a)//传递的是行地址             example(*a); //传递的是行列
void example(int (*p)[3];                void example(int *p)//p+5为最后一个元素的地址  
*(*(p+1)+1)

24、

int *a[5]是指针数组,int (*a)[5]才是数组指针

25

c语言中的不同进制的表现方法
在C语言里,整数有三种表示形式:十进制,八进制,十六进制。
其中以数字0开头,由0~7组成的数是八进制。以0X或0x开头,由0~9,A~F或a~f 组成是十六进制。除表示正负的符号外,以1~9开头,由0~9组成是十进制。
1.十进制:除表示正负的符号外,以1~9开头,由0~9组成。如,128,+234,-278。
2,八进制:以0开头,由0~7组成的数。如,0126,050000.
3,十六进制:以0X或0x开头,由0~9,A~F或a~f 组成。如,0x12A,0x5a000

定义是预处理命令的一种,一条预处理必须占一行,它允许用一个标识符来表示一个字符串。先看一个例子:
#include <stdio.h>

#define N 100

int main(){
int sum = 20 + N;
printf("%d\n", sum);
return 0;
}
运行结果:
120

该示例中的语句int sum = 20 + N;,N被100代替了。

#define N 100就是宏定义,N为宏名,100是宏的内容。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。

宏定义是由源程序中的宏定义命令#define完成的,宏代换是由预处理程序完成的。

宏定义的一般形式为:
#define 宏名 字符串
#表示这是一条预处理命令,所有的预处理命令都以#开头。define是预处理命令。宏名是标识符的一种,命名规则和标识符相同。字符串可以是常数、表达式等。
这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。
程序中反复使用的表达式就可以使用宏定义,例如:
#define M (nn+3n)
它的作用是指定标识符M来代替表达式(yy+3y)。在编写源程序时,所有的(yy+3y)都可由M代替,而对源程序编译时,将先由预处理程序进行宏代换,即用(yy+3y)表达式去替换所有的宏名M,然后再进行编译。

将上面的例子补充完整:
#include <stdio.h>

#define M (nn+3n)

int main(){
int sum, n;
printf(“Input a number: “);
scanf(”%d”, &n);
sum = 3M+4M+5*M;
printf(“sum=%d\n”, sum);
return 0;
}
运行结果:
Input a number: 10↙
sum=1560

上面的程序中首先进行宏定义,定义M来替代表达式(nn+3n),在sum=3M+4M+5M中作了宏调用。在预处理时经宏展开后该语句变为:
sum=3
(nn+3n)+4*(nn+3n)+5*(nn+3n);
需要注意的是,在宏定义中表达式(nn+3n)两边的括号不能少,否则会发生错误。如当作以下定义后:
#difine M nn+3n
在宏展开时将得到下述语句:
s=3nn+3n+4nn+3n+5nn+3*n;
这相当于:
3n2+3n+4n2+3n+5n2+3n
这显然是不正确的。所以进行宏定义时要注意,应该保证在宏代换之后不发生错误。
对宏定义的几点说明

  1. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换。字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查,如有错误,只能在编译已被宏展开后的源程序时发现。

  2. 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起替换。

  3. 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。例如:
    #define PI 3.14159

int main(){
// Code
return 0;
}

#undef PI

void func(){
// Code
}
表示PI只在main函数中有效,在func中无效。

  1. 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换,例如:
    #include <stdio.h>
    #define OK 100
    int main(){
    printf(“OK\n”);
    return 0;
    }
    运行结果:
    OK

该例中定义宏名OK表示100,但在 printf 语句中 OK 被引号括起来,因此不作宏代换,而作为字符串处理。

  1. 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名,在宏展开时由预处理程序层层代换。例如:
    #define PI 3.1415926
    #define S PIyy /* PI是已定义的宏名*/
    对语句:
    printf("%f", S);
    在宏代换后变为:
    printf("%f", 3.1415926yy);

  2. 习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。

  3. 可用宏定义表示数据类型,使书写方便。例如:
    #define UINT unsigned int
    在程序中可用UINT作变量说明:
    UINT a, b;
    应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。

请看下面的例子:
#define PIN1 int *
typedef int *PIN2; //也可以写作typedef int (*PIN2);
从形式上看这两者相似, 但在实际使用中却不相同。

下面用PIN1,PIN2说明变量时就可以看出它们的区别:
PIN1 a,b;
在宏代换后变成:
int *a,b;
表示a是指向整型的指针变量,而b是整型变量。然而:
PIN2 a,b;
表示a、b都是指向整型的指针变量。因为PIN2是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型, 但毕竟是作字符代换。在使用时要分外小心,以避出错。
通常,预处理命令位于源文件的开头,也可以写在函数与函数之间;不能在一行上写多条预处理命令:宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定。
10.Char a[]=”china”;数组a占字节数为6,而字符串长度为5.字符数组a长度6.
11.int a[5]=“0123”;错误原因:int型赋初始值需要加括号,
12.
下列程序的输出结果是(D)。

#define P 3
void F(int x){ return(Pxx); } main( )
{ printf("%d\n",F(3+5)); }
A)192 B)29
C)25 D)编译出错
原因:宏定义只是简单的带入没有函数功能,所以运行出错
13.数据的独立性分为:逻辑独立性(元素间的独立性)和物理独立性(存储结构独立性
14.#include<stdio.h>
int main()
{int a=1,i,b=1;
for(i=0;i<2;i++)
a=a+i,b=a+i;
printf("%d%d",a,b);
return 0;
}结果为23

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值