阅读背景:

很久没看过C语言了.问几个自考的题目(选择题),有些已在TC下测试过,但不太理解,还盼各位讲解一下,谢谢了.

来源:互联网 
1.下面转义字符中错误的是:
  A: '
1.下面转义字符中错误的是:
  A: '\000'    B: '\14'       C: '\x111'  D:  '\2';
  我先的是C 因为x111表示的十六进制的111, 已经大于256了.所以它是错误的,我这样理解正确吗?

2.执行语句 printf("%x",-1); 后输出的结果是:
  A: -1   B: -ffff  C: 1   D: ffff
  在TC2.0下面输入代码,结果是: D. 是不是因为-1在存储时,全为:"1111111111111111"?? 
  是"-1"的补码吗?是怎样算出来的??

3.关于for 循环. 执行 for (i =1; i++<4;)后,i 的值是:
  A 3    B 4   C  5  D不确定.
  正确答案是:C 谁能讲解一下? 另外请讲解一下: for(i =1 ;i <5; i++)  它到底是怎样处理的? i 的值到底是怎样变化的?

4. 下面说法中,错误的是:
   A: C语言中循环嵌套的层数没有限定
   B: C语言中的内部函数只能在本文件中被调用
   C: 用typedef语句定义的数据类型名称必须是大写字母 
   D: C语言中的continue语句,可以通过改变程序结构而省略

   个人分析:D应该是正确的.个人意见,选C ,说不出太大的理由..

5. 设enum week{ sun, mon, tue, wed, thu, fri, sat}day; ,正确的赋值语句是:
   A: sum = 0;   B: sum = day;   C:mon = sun + 1;      D: day = sun;
   个人选D, 凭感觉.

6. 设: int x[] ={1,2,3,4,5,6,7,8,9,0}, *p= x, k; 且0<=k<10,则对数组无素x[k]的错误引用是:
   A: p+k;  B: *(x+k)  C: x[p-x +k],   D: *(&x[k]);
   个人分析:A和B是没问题的,C: p是指针,指向x,那么p应该是x的地址,所以 p-x 应该是"0",那么D错在哪里呢? 有点不明白它的优先级 &x[k],,是先计算&x,还是先计算 x[k]..好像不管怎样计算,D都是错误的.

8 个解决方案

#1


6.选择 A

#2


1.你的理解是正确的
2.1111-1111-1111-1111 是-1的补码,求法:
正数的补码是本身;而负数,简单的求法,先取-1的绝对值1,1的反码是 1111-1111-1111-1110
1的反码加1就是-1的补码1111-1111-1111-1111了。
3.i++<4这句是 先执行i<4,然后i再自增,所以i执行到4时不满足条件,并自增1,然后退出循环。至于那个for语句,在第一趟循环是,i=1, 然后跟循环条件也就是i<5比较,如果满足,进入循环体,这趟循环结束后i++执行自增,然后跟循环条件比较,以此类推。
4.是选C
5.选D没错
6.应该选A,A不是对元素x[k]在正确应用,它只是指向元素x[k]的指针而已。D是正确的,&x[k]是

#3


接上
&x[k]返回是指向元素x[k]地址的指针,所以*(&x[k])就相当于x[k]了。

#4


5. 设enum week{ sun, mon, tue, wed, thu, fri, sat}day; ,正确的赋值语句是:
   A: sum = 0;   B: sum = day;   C:mon = sun + 1;      D: day = sun;
   个人选D, 凭感觉.

我捡漏了
枚举型变量当第一个值没有显式定义时默认从0开始
即sun=0;mon=1;tue=2....
在语句的执行过程中,该枚举值不能显式地赋值,所以ABC全错,而D的涵义为声明一个week型枚举型变量day,其初始值为sun的

#5


我也捡漏 :-)

4. 下面说法中,错误的是:
C: 用typedef语句定义的数据类型名称必须是大写字母

:: C语言没有规定数据类型一定用大写。大小写都可以。事实上,有很多标准库中的类型就都是小写的。如 size_t ,经常见到的。

5. 设enum week{ sun, mon, tue, wed, thu, fri, sat}day; ,正确的赋值语句是:
A: sum = 0; B: sum = day; C:mon = sun + 1; D: day = sun;

::有笔误,应为:
A: sun = 0; B: sun = day; C:mon = sun + 1; D: day = sun;
从sun到sat都是常量,不能被赋值。只有day是变量。

6. 设: int x[] ={1,2,3,4,5,6,7,8,9,0}, *p= x, k; 且0<=k<10,则对数组无素x[k]的错误引用是:
A: p+k; B: *(x+k) C: x[p-x +k], D: *(&x[k]);
个人分析:A和B是没问题的,C: p是指针,指向x,那么p应该是x的地址,所以 p-x 应该是"0",那么D错在哪里呢? 有点不明白它的优先级 &x[k],,是先计算&x,还是先计算 x[k]..好像不管怎样计算,D都是错误的.

:: p+k 是指针,指向x[k]。 &x[k]也是对x[k]取指。

#6


呵呵,这些题目还是比较简单的

#7


嗯,谢谢楼上各位了。
第6题把题目意思弄错了,不过本身对D的理解就不是很清楚。当然啦,现在清楚了。

#8


3.i++<4这句是 先执行i<4,然后i再自增.
我反对这样的说法:虽然编译器优化后是这样.确切的是:
i++,i自增1后返回它的原来的值,再和4做比较,如果使用C++,可以做以下的程序实验:
建议一个自己的int类.
struct MyInt
{
int my_i;
MyInt(int i):my_i(i){}
MyInt operator++(int)
{
int temp = my_i;
my_i += 1;
cout<<"my_i++,目前的值:"<<my_i<<"\n";
return MyInt(temp);
}
};

bool operator<(MyInt comp1,int comp2)
{
cout<<"进行比较\n";
return (comp1.my_i < comp2);
}
for(MyInt test_i(1); test_i++ < 4;)
{

}
cout<<"最后的值:"<<test_i.my_i<<"\n";

0'    B: ''       C: '\x111'  D:  '';   A: '
1.下面转义字符中错误的是:
  A: '\000'    B: '\14'       C: '\x111'  D:  '\2';
  我先的是C 因为x111表示的十六进制的111, 已经大于256了.所以它是错误的,我这样理解正确吗?

2.执行语句 printf("%x",-1); 后输出的结果是:
  A: -1   B: -ffff  C: 1   D: ffff
  在TC2.0下面输入代码,结果是: D. 是不是因为-1在存储时,全为:"1111111111111111"?? 
  是"-1"的补码吗?是怎样算出来的??

3.关于for 循环. 执行 for (i =1; i++<4;)后,i 的值是:
  A 3    B 4   C  5  D不确定.
  正确答案是:C 谁能讲解一下? 另外请讲解一下: for(i =1 ;i <5; i++)  它到底是怎样处理的? i 的值到底是怎样变化的?

4. 下面说法中,错误的是:
   A: C语言中循环嵌套的层数没有限定
   B: C语言中的内部函数只能在本文件中被调用
   C: 用typedef语句定义的数据类型名称必须是大写字母 
   D: C语言中的continue语句,可以通过改变程序结构而省略

   个人分析:D应该是正确的.个人意见,选C ,说不出太大的理由..

5. 设enum week{ sun, mon, tue, wed, thu, fri, sat}day; ,正确的赋值语句是:
   A: sum = 0;   B: sum = day;   C:mon = sun + 1;      D: day = sun;
   个人选D, 凭感觉.

6. 设: int x[] ={1,2,3,4,5,6,7,8,9,0}, *p= x, k; 且0<=k<10,则对数组无素x[k]的错误引用是:
   A: p+k;  B: *(x+k)  C: x[p-x +k],   D: *(&x[k]);
   个人分析:A和B是没问题的,C: p是指针,指向x,那么p应该是x的地址,所以 p-x 应该是"0",那么D错在哪里呢? 有点不明白它的优先级 &x[k],,是先计算&x,还是先计算 x[k]..好像不管怎样计算,D都是错误的.

8 个解决方案

#1


6.选择 A

#2


1.你的理解是正确的
2.1111-1111-1111-1111 是-1的补码,求法:
正数的补码是本身;而负数,简单的求法,先取-1的绝对值1,1的反码是 1111-1111-1111-1110
1的反码加1就是-1的补码1111-1111-1111-1111了。
3.i++<4这句是 先执行i<4,然后i再自增,所以i执行到4时不满足条件,并自增1,然后退出循环。至于那个for语句,在第一趟循环是,i=1, 然后跟循环条件也就是i<5比较,如果满足,进入循环体,这趟循环结束后i++执行自增,然后跟循环条件比较,以此类推。
4.是选C
5.选D没错
6.应该选A,A不是对元素x[k]在正确应用,它只是指向元素x[k]的指针而已。D是正确的,&x[k]是

#3


接上
&x[k]返回是指向元素x[k]地址的指针,所以*(&x[k])就相当于x[k]了。

#4


5. 设enum week{ sun, mon, tue, wed, thu, fri, sat}day; ,正确的赋值语句是:
   A: sum = 0;   B: sum = day;   C:mon = sun + 1;      D: day = sun;
   个人选D, 凭感觉.

我捡漏了
枚举型变量当第一个值没有显式定义时默认从0开始
即sun=0;mon=1;tue=2....
在语句的执行过程中,该枚举值不能显式地赋值,所以ABC全错,而D的涵义为声明一个week型枚举型变量day,其初始值为sun的

#5


我也捡漏 :-)

4. 下面说法中,错误的是:
C: 用typedef语句定义的数据类型名称必须是大写字母

:: C语言没有规定数据类型一定用大写。大小写都可以。事实上,有很多标准库中的类型就都是小写的。如 size_t ,经常见到的。

5. 设enum week{ sun, mon, tue, wed, thu, fri, sat}day; ,正确的赋值语句是:
A: sum = 0; B: sum = day; C:mon = sun + 1; D: day = sun;

::有笔误,应为:
A: sun = 0; B: sun = day; C:mon = sun + 1; D: day = sun;
从sun到sat都是常量,不能被赋值。只有day是变量。

6. 设: int x[] ={1,2,3,4,5,6,7,8,9,0}, *p= x, k; 且0<=k<10,则对数组无素x[k]的错误引用是:
A: p+k; B: *(x+k) C: x[p-x +k], D: *(&x[k]);
个人分析:A和B是没问题的,C: p是指针,指向x,那么p应该是x的地址,所以 p-x 应该是"0",那么D错在哪里呢? 有点不明白它的优先级 &x[k],,是先计算&x,还是先计算 x[k]..好像不管怎样计算,D都是错误的.

:: p+k 是指针,指向x[k]。 &x[k]也是对x[k]取指。

#6


呵呵,这些题目还是比较简单的

#7


嗯,谢谢楼上各位了。
第6题把题目意思弄错了,不过本身对D的理解就不是很清楚。当然啦,现在清楚了。

#8


3.i++<4这句是 先执行i<4,然后i再自增.
我反对这样的说法:虽然编译器优化后是这样.确切的是:
i++,i自增1后返回它的原来的值,再和4做比较,如果使用C++,可以做以下的程序实验:
建议一个自己的int类.
struct MyInt
{
int my_i;
MyInt(int i):my_i(i){}
MyInt operator++(int)
{
int temp = my_i;
my_i += 1;
cout<<"my_i++,目前的值:"<<my_i<<"\n";
return MyInt(temp);
}
};

bool operator<(MyInt comp1,int comp2)
{
cout<<"进行比较\n";
return (comp1.my_i < comp2);
}
for(MyInt test_i(1); test_i++ < 4;)
{

}
cout<<"最后的值:"<<test_i.my_i<<"\n";

0'    B: ''      



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: