PTA题选

判断题:

任何表达式语句都是表达式加分号组成的。True
C语言语句都有结束符

指向结构体变量的指针可以作函数参数,实现传址调用。True

结构体成员的类型必须是基本数据类型。False

if(a=5) 是允许的。True
(a=5)永远为真 

假设有变量定义语句float f = 1234567890123.123456;,打印语句printf("f = %f", f); 的输出是f = 1234567954432.000000 。那么可以这样解释这种想象:因为float类型的数据精度是十进制7~8位,第9位以后的数据是随机的,即下次再输出这个数时,第9位以后的数据可能会不一样。False

int (*p)[4]它表示p是一个指针数组,它包含4个指针变量元素。False
它是一个数组指针,指向一个长度为4的数组。

选择题:

以下选项中不正确的整型常量是()。
A.12L B.-10 C.012 D.2,900 
解答:D
整型常量中不可有逗号 

若a为int类型,且其值为3,则执行完表达式a+= a-= a*a后,a的值是__。
A.-3 B.9 C.-12 D.6
解答:C
将a+= a-= a*a分解得
a=a-a*a;得a=-6 
a=a+a;得a=-12 

下面哪个表达式的值是2。
A.6%3 B.-5%3 C.5%-3 D.-5%-3
解答:C
对于%的结果,其符号取决于%前面的数的符号

对下列代码的描述:
#include "stdio.h"
int main(){
    long num=1;
    while(num++ > 0) for(long i=num; i >=0; i--)printf("i :=\n \t %ld \n" , i);
    return 0;
}
正确的是:
A.程序有编译错误,不能执行
B.循环条件永为真,循环无限次,程序根本停不下来,打印输出无限行
C.循环有限次,程序正常结束,打印输出有限行
D.程序运行过程必定会出错(崩溃),结果打印输出有限行
解答:C
具体原因请移步 https://blog.csdn.net/BAFH499/article/details/122116641 

以下程序段的输出结果是()。
    int a=5, b=4, c=6, d;
    printf("%d", d=a>b? a>c?a:c:b);
A.5 B.4 C.6 D.不确定
解答:C
其实就是顺序的问题
d=a>b? a>c?a:c:b实则为d=(a>b? (a>c?a:c):b)
先判断(a>c?a:c),再判断外层,最后赋值 

The following piece of code prints out__.
for (a=1,i=-1; -1<=i<1; i++) {
    a++;
    printf("%2d", a);
}
printf("%2d", i);
A.2 3 1 B.-1 C.1 2 0 D.3
解答:B
这题就是对于-1<=i<1的判断
先判断-1<=i,成立得其值为1,再判断1<1,不成立不进入循环,直接输出i

下述代码执行后,a,b的值各为多少?
    int a = 0, b = 0;
    a = (b++, 4);
A.a=4, b=1 B.a=0,b=1 C.a=1,b=1 D.a=4,b=0
解答:A
这题考逗号表达式,(b++, 4)的值为最后一个表达式的值4 

对于定义 char str[] = "abc\000def\n"(注:其中0为数字零)求字符串str的长度len和数组str的大小size,len和size分别是:
A.12 ,13 B.3 ,11 C.3 ,9 D.3 ,4
解答:C
对于字符串数组,\0、\00 、\000都视为\0(当\后面的0多于3个就不是这样了),且总会在末尾加一个\0,所以空字符串大小为1,"abc\000def\n"的大小为9. 
而长度则是第一个\0前的字符数 

有如下定义:
struct Student{
    char name[10];
    int age;
    char gender;
}std[3], *p=std;
则以下各输入语句中错误的是:
A.scanf("%d",&(*p).age);
B.scanf("%c",&std[0].gender);
C.scanf("%c",&(p->gender));
D.scanf("%s",&std.name);
解答:D
std.name已经是数组的地址了,再加取地址符就是错误的 

下面的这个循环的循环次数是( )。 
for(int i=0,j=10; i=j=10; i++,j--)
A.语法错误,不能执行 B.无限次 C.10 D.1
解答:B
循环内的判断语句变为了赋值语句i=j=10,出不了循环 

以下名字,不能作为C语言标识符的是:
A.ThisIsQingdaoUniversity

B.$$

C.monkey~1

D._
解答:C
$$是一个例外,它是可以用的。 

If all variables have been defined and declared in the following program, all the variables which can be used in function fun() are __.
void fun(int x)
{
    static int y;
    ……
    return;
}
int z;
void main( )
{
    int a,b;
    fun(a);
    ……
}
A.x,y
B.x,y,z
C.a,b,y,z
D.a,b,x,y,z
解答:A
z虽然是全局变量,但定义在函数fun之后,调用不到,而a、b是主函数里的,也调用不到

对于 C/C++语言的函数,下列叙述中正确的是( )。
A.函数的定义不能嵌套,但函数调用可以嵌套
B.函数的定义可以嵌套,但函数调用不能嵌套
C.函数的定义和调用都不能嵌套
D.函数的定义和调用都可以嵌套
解答:A
比如在主函数里,就不能定义一个fun函数,只能在主函数外定义。但是可以在主函数内调用fun函数,前提是已经声明或定义过了。 

函数调用语句function((a,b),c)中含有的实参个数为( )。
A.1 B.3 C.2 D.语法有误
解答:C
(a,b)的值作为一个实参

Given int a[2][3];. Which of the following can correctly make reference to array a?
A.a[2][!1]
B.a[2][3]
C.a[0][3]
D.a[1>2][ !1] 
解答:D
明显ABC是错的,D是可行的。 

有说明语句int a[4][5]; ,则a[2]+3表示__。
A.a数组行下标为2、列下标为3的元素的地址
B.a数组行下标为2、列下标为3的元素的值
C.a数组第2行的首地址
D.a数组第3行的首地址
解答:A

For definitions: char s[2][3]={"ab", "cd"}, *p=(char *)s; the expression __ is correct and its value is equivalent to the element s[1][1].
A.*(s+3)
B.*s+2
C.p[1][1]
D.*++p+2
解答:D
s[1][1]是d,*(s+3)是数组第四行的首地址,*s+2是数组第一行的第三个元素的地址,p[1][1]是有编译问题的
*++p+2是(*(p=p+1))+2,*(p=p+1)是b,加2后的字符为d,符合题意 

以上答案仅供参考
 

### 回答1: 这种情况是因为float类型的数据精度有限,只能保留7~8位有效数字,超过这个范围的数字会被舍弃或者四舍五入。因此,当我们打印一个超过精度范围的float类型变量时,输出的结果可能会出现误差,而且每次输出的结果可能会不同。 ### 回答2: 假设有这样的变量定义语句:float f = 1234567890123.123456;,按照理论上数据类型float的精度来看,应该能够精确保存小数点后7-8位数字。但是,实际上运行程序后打印出来的结果是f = 1234567954432.000000。这到底是为什么呢? 我们需要了解一下,float类型的数据采用的是二进制表示法,因此存储值的时候会受到精度的限制。float类型只有32位,其中1位表示符号位,8位表示指数位,23位表示尾数位。这个结构使得float类型在有限的存储位数下,能够精确表示出的数字范围有限,精度也比较低。 在上面这个例子里,1234567890123.123456这个数字已经超出了float精度所能表示的范围,导致存储在内存中的值被近似取整,并且后面的数字也无法保证精度。所以当打印语句printf("f = %f", f)执行时,实际上是输出了被近似之后的数值。 另外,浮点数在计算机内部存储时是以二进制形式表示的,尽管绝大部分的10进制小数都可以转化为有限位的2进制小数,但也有一部分10进制小数不能转化为有限位的2进制小数,它们会以近似值的形式存在计算机中。对于这些近似值来说,其位于某个不规则的位置上,导致下一次输出这个数时,后面位数的数值可能会发生变化。 因此,这种情况是非常普遍的,我们需要根据实际情况选择合适的数据类型和存储方式,来确保我们的数值计算结果是准确可靠的。 ### 回答3: 首先,我们需要了解计算机内部如何存储浮点数。通常情况下,一个浮点数(float)会被存储在32位(4字节)的内存空间中,其中1位表示符号,8位表示指数,23位表示尾数,也就是数字精度的部分。 对于这道题目中的浮点数f = 1234567890123.123456,它超出了float类型所能表示的精度范围,因为float类型只能精确表示7到8位十进制数。所以在计算机内部,这个浮点数会被近似存储,并不是完全准确的存储下来。具体来说,存储时会存在一定的误差。 当我们通过打印语句printf("f = %f", f)输出这个浮点数时,实际上输出的是近似存储的浮点数。这个近似值是由计算机对原始浮点数进行四舍五入(rounding)计算得到的。由于这个过程中涉及到近似和舍入,导致输出的结果和原始值不完全相同。 此外,浮点数的舍入误差还受到计算机使用的算术编码方式的影响。计算机中使用的是二进制编码,而十进制数在转换成二进制时往往需要无限循环小数的表示,因此也会导致舍入误差。 综上所述,这题的输出结果f = 1234567954432.000000的不准确性是由于浮点数存储的近似性和舍入误差导致的。如果我们想提高计算精度,可以使用双精度浮点数(double)或者高精度计算库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值