笔试题学习

​​​​​​csdn博客解决行间距过大,​换行时按shift+回车。

  • 题目
//执行下面语句:
a[4];
for(int i=0;i<4;++i){
  if(i&1){
     a[i]=1;
  }
}
//则a数组中的值为()

0 1 0 1
判断奇偶,奇数为1
& 按位取与
| 按位取或
 ~ 按位取非
 ^ 按位异或

https://www.runoob.com/cprogramming/c-operators.html

  • 题目

C++语言本身没有输入输出语句。说法是否正确?
在C语言中,没有输入输出语句,对文件的读写都是用库函数来实现的。ANSI规定了标准输入输出函数,用它们对文件进行读写。C提供的函数以库的形式存放在系统中,它们不是C语言文本中的组成部分,是经过模板化了的原有标准库中的iostream部分。 不把输入输出作为C语言提供的语句的目的是使C语言编译系统简单,因为将语句翻译成二进制的指令是在编译阶段完成的,没有输入输出语句可以避免在编译阶段处理与硬件有关的问题,可以使编译系统简化,而且通用性强,可移植性好,对各种型号的计算机都适用。

  • 判断如下输入
int main()
{
    int a = 4;
    int b = 0;

    //b = (a++) + (a*=2);//a=9, b=16
    //b = (a++) + (a++) + (a*=2);//a=10, b=24
    // 先从左到右计算a计算式
    // 计算a++,a等赋值表达式结束之后+1,返回a,
    // 计算a++,a等赋值表达式结束之后+1,返回a,
    // 计算a*=2,返回a。
    // 所以a=8++再++,b=3*a=8*3=24

    //b = (a+=1) + (a*=2);//a=10, b=20
    //b = (a+=1) + (a+=1) + (a*=2);//a=12, b=36
    // 先从左到右计算a计算式
    // 计算a+=1,a=5,返回a,
    // 计算a+=1,a=6,返回a,
    // 计算a*=2,a=12,返回a。
    // 所以a=12,b=3*a=3*12=36

    //b = (++a) + (a*=2);//a=10, b=20
    //b = (++a) + (++a) + (a*=2);//a=12, b=36
    // 先从左到右计算a计算式
    // 计算++a,a=5,返回a,
    // 计算++a,a=6,返回a,
    // 计算a*=2,a=12,返回a。
    // 所以a=12,b=3*a=3*12=36

    //b = ++a = (a++) + (a*=2);//a=21, b=20
    //b = (++a) = (a++) + (a*=2);//a=21, b=20
    // 先从左到右计算a计算式
    // 计算++a,a=5,返回a,
    // 计算a++,a等待计算结束之后+1,返回a=5。
    // 计算a*=2,a=10,返回a。
    // 所以b=2*a=20,a=b+1=21

   // b = (++a) = (a*=2);//a=10, b=10
    // 先从左到右计算a计算式
    // 计算++a,a=5,返回a,
    // 计算a*=2,a=10,返回a。
    // 所以a=10,b=a=10

    //b = ++a = 10; // a=10, b=10
    //b = (++a) = 10; //a=10, b=10
    //b = (++a) += (a++);//a=11, b=10
    // 先从左到右计算a计算式
    // 计算++a,a=5,返回a,
    // 计算a++,a等表达式结束之后+1,返回a。
    // 计算a+=a,为a=2*a=10
    // 所以b=10,a=b+1=11

    //b = (++a) = a + (a++);//a=11, b=10
    //b = (++a) = (++a) + (a++);//a=13, b=12
    // 先从左到右计算a计算式
    // 计算++a,a=5,返回a,
    // 计算++a,a=6,返回a。
    // 计算a++,a等表达式结束之后+1,返回a。
    // 所以b=a+a=12,a最后++为13

    //b = a += (a++);//a=9, b=8
    //b = a = a + (a++);//a=9, b=8

    //b = a += (++a) ;// a=10, b=10

    //b = (a++) += a;// compile error, expression is not assignable
    //b = (++a) += a;// a=10, b=10

    //b = (++a) += (a++);// a=11, b=10

    //b = (++a) += (a*=2);// a=20, b=20
    //b = (++a) = a + (a*=2);// a=20, b=20
    //b = (++a) = (++a) + (a*=2);// a=24, b=24
    //b = (++a) = 12 + (a*=2);// a=22, b=22

    //b = a += a -= a * a;// a=-24, b=-24
    // 从右向左计算
    // 先计算a*a=16,a-=16=-12
    // a+=a,为a=2*a=-12*2=-24
    // b=a=-24

    //b = ++a += a -= a * a;// a=-40, b=-40
    // 从右向左计算
    // 先计算++a,a=5,返回a
    // 先计算a*a=25,a-=16=-20
    // a+=a,为a=2*a=-20*2=-40
    // b=a=-40

    cout << a << endl;
    cout << b << endl;

    return 0;
}

一个栈的入栈序列是 A,B,C,D,E,则栈的不可能的输出序列是?
A、EDCBA;
B、DECBA;    
C、DCEAB;
D、ABCDE 
【标准答案】C
先从答案中看第一个元素,则第一个元素之前的,都是按照入栈顺序入栈的。然后再对比入栈和出栈,能不能够实现。

void func()  {    
    static int val;
}
中,变量 val 的内存地址位于: 
A. 已初始化数据段
B.未初始化数据段     
C.堆
D.栈 
【标准答案】A
 

static int g1;
static int g2 = 0;
static int g21 = 1;
int g3;
int g4 = 0;
int g41 = 1;
char* g5;
char* g6 = NULL;
char* g7 = "aaa";

void func()
{
    static int s1;
    static int s2 = 0;
    static int s3 = 1;
    return;
}

int main()
{
    return 0;
}



查看相关命令:gcc -g -o main4 main4.cpp
size main4
nm main4 -f sysv
参考资料
https://my.oschina.net/u/2310891/blog/504001
https://www.nowcoder.com/questionTerminal/155ffa8b2be94562a26145acaddbd5fd

判断如下输入

int main()
{
    int a=5, b=7, c = 0;
    //c = a++b;//expect ';' after expression
    //c = a+++b;// 6 7 12
    //c = (a++)+b;// 6 7 12
    //c = a+(++b);// 5 8 13

    //c = a++++b;// epression is no assignable
    //c = a + + + b;// 5 7 12
    c = a + + b;// 5 7 12
    cout << a << " " << b << " " << c;

    return 0;
}


判断如下输出

struct CLS
{
    int m_i = -1;
    CLS( int i ) : m_i(i) {
        cout << __LINE__<<endl;
    }
    CLS()
    {
        cout << __LINE__<<endl;
        CLS(0);
    }
};


int main()
{
    CLS obj;
    cout << obj.m_i << endl;
    return 0;
}

以下代码中的输出语句输出0吗,为什么?
不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。
只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。

以下程序能通过编译吗

int main()
{
    unsigned int const size1 = 2;
    char str1[ size1 ];
    unsigned int temp = 1;
    cin >> temp;
    unsigned int const size2 = temp;
    char str2[ size2 ];
    return 0;
}

str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。
 

以下程序输出结果为

//b.c中的内容
#include "a.h"

void IncreCounter(void)

{

    g_count++;

    printf("the addr of g_count in IncreCounter = 0x%llx\n", &g_count);

}

int main(void)

{

    printf("Init =%d\n", g_count);

    IncreCounter();

    printf("IncreCounter =%d\n", g_count);

    AddCount(19);

    printf("Init =%d\n", g_count);

    return 0;

}

//a.h的内容

static int g_count = 0;

void AddCount(int count);

//a.c的内容

#include "a.h"

void AddCount(int count)

{

    g_count += count;

    printf("the addr of g_count in  AddCount = 0x%llx\n", &g_count);

}

执行结果:

Init =0
the addr of g_count in IncreCounter = 0x601040
IncreCounter =1
the addr of g_count in  AddCount = 0x60103c
Init =1
 

分析:

b.c 包含了a.h, 所以g_count作用范围只在b.c中。a.c里AddCount中的g_count作用范围也只是a.c,b.c和a.c中的g_count其实是两个不同的值,它的内存地址不一致。


以下代码输出为:

#include <stdio.h>
int main()
{
    int i = 0, j = 0;
    printf("Output is : ");
    // Doubt: how does while accept 2 arguments?? and how it works??
    // while (i < 5, j < 10) equals to while (i < 5 || j <10)
    while (i < 5, j < 10)
    {
        i++;
        j++;
    }
    printf("%d, %d\n", i, j); //Output is : 10, 10
}
 

#define log_err(format, args...) do { \

if (LOG_ERROR >= log_level){ \

time_t __log_tt__ = time(NULL); \

struct tm * __log_tm__ = localtime(&__log_tt__); \

fprintf(stderr, "%d-%02d-%02d %02d:%02d:%02d [%s|%s@%s,%d] " format "\n", __log_tm__->tm_year+1900,__log_tm__->tm_mon+1,__log_tm__->tm_mday,__log_tm__->tm_hour,__log_tm__->tm_min,__log_tm__->tm_sec,"ERROR", __func__, __FILE__, __LINE__, ##args );\

} \

} while (0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值