牛客刷题
1.有关类的说法不正确的是( D )
A.类是一种用户自定义的数据类型
B类中的成员函数可以存取类中的私有数据
C在类中,如果不作特别说明,所有的数据均为私有类型
D在类中,如果不作特别说明,所有的成员函数均为公有类型
解析:在C++中,类默认的方式时private,不管是继承方式还是成员。
2.在gcc编译器下,针对以下代码,const char str1[] = "abc"; const char str2[] = "abc"; const char *p1 = "abc"; const char *p2 = "abc";
那么针对printf("%d %d %d %d\n",str1, str2,p1,p2)的结果, 正确的说法是:输出的前两个数不同,输出的后两个数相同。
解析:前两个是字符数组,定义在栈上,明显地址不同;字符串常量定义在静态区,仅有一份拷贝,所以后面两个指针指向的地址相同。(这道题在于数组和指针变量的地址存储区域,回去再研究研究)
3.有以下程序
#include <stdio.h> #define SQR( X ) X * X main( ) { int a=10, k=2, m=1; a / = SQR( k+m )/SQR( k+m ); printf( "%d\n" ,a ); }
程序运行后的输出结果是1.
解析:这道题的坑在于“/”,表达式写出来之后是k+m*k+m/k+m*k+m。
4.下列程序的运行结果是YY,78,96,请为横线处选择合适的程序(答案是:*a,或者a[])
#include <stdio.h> #include <string.h> typedef struct { char name[9]; float score[2]; }STU; void f(STU _______) { STU b={"YY",78,96}; int i; strcpy(a->name,b.name); for(i=0;i<2;i++) a->score[i]=b.score[i]; } main() { STU c={"LL",90,80}; f(&c); printf("%s,%.0f,%.0f\n",c.name,c.score[0],c.score[1]); }
解析:由a->name知a为指针,那么A肯定正确,D说的是数组作为函数的参数会退化成指针,所以D也是正确的。
其中有个选项是&a,错误的原因是变量的引用是别名而不是指针,所以后文肯定不能是a->score[i] ,引用的话后文应该是a.score[i],例程如图: