[牛客网]错题整理(1)

来源:互联网 发布:mac office 登陆激活 编辑:程序博客网 时间:2024/06/06 06:50

牛客网错题集(1)

1.int main(int argc ,char** argv)

{

    int n = 9, i;

    for (i = 1; i<argc; i++)

    n = n * 10 + *argv[i] - '0';

    printf("%d\n", n);

    return 0;

}

经编译连接生成的可执行文件 tt.exe 。若执行输入以下命令行 tt 12 345 678 ,则程序运行的输出结果是()

答案:9136

解析:输入tt 12 345 678时,argc == 4

argv == {“tt”, "12", "345", "678"}

*argv[i]分别取了 1, 3,6

for循环后,得到9136

 

2.代码可以通过编译吗?如果不能应该如何修改?

template<class T> class Foo{

        T tVar;

    public:

        Foo(T t) : tVar(t) { }

};

template<class T> class FooDerived:public Foo<T>

{

};

int main()

{

    FooDerived<int> d(5);

    return 0;

}

答案:编译错误,可以在FooDerived类中添加一个构造函数解决问题。

解析:当基类构造函数需要外部传递参数才能进行初始化时,派生类必须显式定义构造函数,为基类传递参数;基类如果不需要传递或者可以不传递参数,派生类可以不用显式定义构造函数。

 

3.下面是一段c程序:

void foo(int b[][3])

{    

    ++b;    

    b[1][1]=9;

}

void main()

{   

    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 

    foo(a);  

    printf(“%d”,a[2][1]);

}

这段程序的输出是()

答案:9

解析:数组传递了首地址,b[0][0]指向数组a[0][0],但是执行++b后,b[0][0]指向a[1][0],因此b[1][1]就是a[2][1],b[1][1]=9即a[2][1]=9。

 

4.turbo c环境下,下面程序运行的结果是()

int main()

{

   printf("\n");

   int a[5] = {1, 2, 3, 4, 5};

   int *p, **k;

   p = a;

   k = &p;

   printf("%d", *(p++));

   printf("%d", **k);

   return 0;

}

答案:12

解析:程序首先定义了一个一维数组a,赋其初值,并定义一个同类型的指针变量p和一个指向指针的指针变量k,然后让指针变量p指向数组的首地址,接着将指针变量p的地址值赋给指向指针的指针变量k。在第一条输出语句中,首先我们需要弄清楚*(p++)的作用,它是先调用指针变量p的值,然后使其自加,输出效果等价于*p,因此,最后输出的结果是数组中的第一个元素。在第二条输出语句中,我们需要弄明白**k的作用,指向指针的指针变量类似于指针变量,如果用**k表示一个数值,可以确定这条输出语句的输出结果是一个数值,而非地址,从表达式k=&p可以看出,k的值是指针变量p的地址值,p的值改变后,k能实时得到改变,那么在第一条输出语句对p的改变,在第二条输出语句中得到了体现。因此,**k输出的是数组中的第二个元素.

原创粉丝点击