【笔试题】【day3】

目录

第一题(Switch后面没有break的问题)

第二题 (return只能return一个数据类型)

第三题(循环)

第四题(二维变量的大小)

第五题(大小端存储(函数栈帧))


第一题(Switch后面没有break的问题)

以下程序的输出结果是()
 

#include <iostream>
int main()
{
    int x=3,y=3;
    switch(x%2)
    { 
        case 1:
        switch (y)
        { 
            case 0:
            cout<<"first";
            case 1:
                cout<<"second";
                break;
            default:
                cout<<"hello";
        }
        case 2:
            cout<<"third";
    }
    return 0;
}

A second third
B hello
C first second
D hellothird 

 这里我们的x=3,y=3,在switch判断的时候x%2也就是1,进入case 1的判断,因为switchy并没有case3,所以我们进入到default模块,也就是打印hello,而我们这里的default后面没有break,所以会往下继续执行,打印case2中的third,所以一共就是打印hellothird

D

第二题 (return只能return一个数据类型)

能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()

A return这二个数
B 形参用数组
C 形参用二个指针
D 用两个全局变量

这里的return所返回的只有一个数据类型,并不能返回两个数据,除非放到数组或者容器里面返回出来

第三题(循环)

设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是(    )

A n=0;while(ch=getchar()!='\n')n++;

B n=0;while(getchar()!='\n')n++;
C for(n=0;getchar()!='\n';n++);
D n=0;for(ch=getchar();ch!='\n';n++);

A:n初始化为0,然后while循环,先getchar,获取到一个字符,然后将这个字符赋值给ch,然后再将ch和'\n'进行比较,如果不等于'\n'就继续++,是就结束循环

B:B和A的区别在条件判断部分,它是拿getchar的值直接跟'\n'进行比较的,也是可以的!

C:用for循环的初始化为n=0然后条件判断getchar获取到一个字符和'\n'进行比较,如果不等于'\n'就继续++,等于'\n'就停止

D:for循环的初始化的部分只会初始化一次,也就是只会读取第一个字符。

D

第四题(二维变量的大小)

32位系统中,定义**a[3][4],则变量占用内存空间为()。

A 4
B 48
C 192
D 12 

三行四列的一个数组,数组中存放的是**,也就是指针类型,也就是12个指针类型,一个指针在32位的系统平台下所占的是4个字节,所以4×12一共是48个字节

([]的优先级高于*,所以先和[]结合,变成数组)

第五题(大小端存储(函数栈帧))

假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?

#include <stdio.h>
int main(){
    long long a = 1, b = 2, c = 3;
    printf("%d %d %d\n", a, b, c);
    return 0;
}

A 1,2,3
B 1,0,2
C 1,3,2
D 3,2,1

什么是大小端?

大端:低位存高地址。

小端:低位存低地址

int i=1;

大端:00 00 00 01(数字1的低位)

小端:01 00 00 00(数字1的高位)

        (低地址)-> (高地址)

long long类型占8个字节,我们不妨将abc三个变量的地址按照低地址到高地址写出来

a:01 00 00 00 00 00 00 00

b:02 00 00 00 00 00 00 00 

c:03 00 00 00 00 00 00 00

printf在调用的时候也会创建一个函数栈帧,栈是从高地址向低地址增长的

(函数调用栈)

(低地址(栈顶))<-----------------------------------------------(高地址(栈底))

入栈的时候是从右往左入栈的。

printf("%d %d %d\n", a, b, c);

所以我们根据上面的printf中的a,b,c从右往左入栈的话就是c先入栈,再b再a

(低地址(栈顶))<-----------------------------------------------(高地址(栈底))

01 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00

然后从栈顶开始出栈,%d的话就是打印一个四字节的元素,

也就是栈顶开始的01 00 00 00

然后再是后面的   00 00 00 00

然后再打印后面的02 00 00 00

也就是输出1 0 2

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桜キャンドル淵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值