tag 标签: 面试题

相关帖子
相关博文
  • 热度 3
    2022-10-30 10:18
    472 次阅读|
    0 个评论
    1、同步电路和异步电路的区别是什么? 同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源,因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。 异步电路:电路没有统一的时钟,有些触发器的时钟输入端与时钟脉冲源相连,这有这些触发器的状态变化与时钟脉冲同步,而其他的触发器的状态变化不与时钟脉冲同步。 2、什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求? 将两个门电路的输出端并联以实现与逻辑的功能成为线与。在硬件上,要用OC门来实现,同时在输出端口加一个上拉电阻。由于不用OC门可能使灌电流过大,而烧坏逻辑门。 3、解释setup和hold time violation,并说明解决办法? Setup/hold time是测试芯片对输入信号和时钟信号之间的时间要求。建立时间是指触发器的时钟信号上升沿到来以前,数据稳定不变的时间。 输入信号应提前时钟上升沿(如上升沿有效)T时间到达芯片,这个T就是建立时间-Setup time。如不满足setup time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿,数据才能被打入触发器。 保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。如果hold time不够,数据同样不能被打入触发器。 建立时间(Setup Time)和保持时间(Hold time)。建立时间是指在时钟边沿前,数据信号需要保持不变的时间。 保持时间是指时钟跳变边沿后数据信号需要保持不变的时间。 如果数据信号在时钟沿触发前后持续的时间均超过建立和保持时间,那么超过量就分别被称为建立时间裕量和保持时间裕量。 4、什么是竞争与冒险现象?怎样判断?如何消除? 在组合逻辑中,由于门的输入信号通路中经过了不同的延时,导致到达该门的时间不一致叫竞争。产生毛刺叫冒险。 判断方法:代数法、图形法(是否有相切的卡诺圈)、表格法(真值表)。如果布尔式中有相反的信号则可能产生竞争和冒险现象。 冒险分为偏“1”冒险和偏“0”冒险。 解决方法:一是添加布尔式的消去项;二是在芯片外部加电容;三是加入选通信号。 5、解释SRAM、SSRAM、SDRAM三个名词? SRAM:静态随机存取存储器(Static Random-Access Memory,SRAM)是随机存取存储器的一种。 SSRAM:Synchronous Static Random Access Memory 的缩写,即同步静态随机存取存储器。 SDRAM:同步动态随机存取内存(synchronous dynamic random-access memory,简称SDRAM)是有一个同步接口的动态随机存取内存(DRAM)。 SSRAM的所有访问都在时钟的上升/下降沿启动。地址、数据输入和其它控制信号均与时钟信号相关。这一点与异步SRAM不同,异步SRAM的访问独立于时钟,数据输入和输出都由地址的变化控制。SDRAM:Synchronous DRAM同步动态随机存储器。 6、FPGA和ASIC的概念,他们的区别? FPGA是可编程ASIC。 ASIC,专用集成电路,它是面向专门用途的电路,专门为一个用户设计和制造的。根据一个用户的特定要求,能以低研制成本,短、交货周期供货的全定制,半定制集成电路。 与门阵列等其它ASIC(Application Specific IC)相比,它们又具有设计开发周期短、设计制造成本低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检验等优点。 7、单片机上电后没有运转,首先要检查什么? (1)首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否是电源电压,例如常用的5V。 (2)接下来就是检查复位引脚电压是否正常。分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。 (3)然后再检查晶振是否起振了,一般用示波器来看晶振引脚的波形;经过上面几点的检查,一般即可排除故障了。 如果系统不稳定的话,有时是因为电源滤波不好导致的。在单片机的电源引脚跟地引脚之间接上一个0.1uF的电容会有所改善。如果电源没有滤波电容的话,则需要再接一个更大滤波电容,例如220uF的。遇到系统不稳定时,就可以并上电容试试(越靠近芯片越好)。 8、什么是同步逻辑和异步逻辑? 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 9、你知道哪些常用逻辑电平?TTL与COMS电平可以直接互连吗? 常用逻辑电平:12V,5V,3.3V。 TTL和CMOS不可以直接互连,由于TTL是在0.3-3.6V之间,而CMOS则是有在12V的有在5V的。CMOS输出接到TTL是可以直接互连。TTL接到CMOS需要在输出端口加一上拉电阻接到5V或者12V。 10、如何解决亚稳态? 亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。当一个触发器进入亚稳态时,既无法预测该单元的输出电平,也无法预测何时输出才能稳定在某个正确的电平上。 在亚稳态期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去。 解决方法主要有: 降低系统时钟; 用反应更快的触发器(FF),锁存器(LATCH); 引入同步机制,防止亚稳态传播; 改善时钟质量,用边沿变化快速的时钟信号; 使用工艺好、时钟周期裕量大的器件。 11、锁存器、触发器、寄存器三者的区别? 触发器:能够存储一位二值信号的基本单元电路统称为“触发器”。 锁存器:一位触发器只能传送或存储一位数据,而在实际工作中往往希望一次传送或存储多位数据。为此可把多个触发器的时钟输入端CP连接起来,用一个公共的控制信号来控制,而各个数据端口仍然是各处独立地接收数据。这样所构成的能一次传送或存储多位数据的电路就称为“锁存器”。 寄存器:在实际的数字系统中,通常把能够用来存储一组二进制代码的同步时序逻辑电路称为寄存器。由于触发器内有记忆功能,因此利用触发器可以方便地构成寄存器。由于一个触发器能够存储一位二进制码,所以把n个触发器的时钟端口连接起来就能构成一个存储 n位二进制码的寄存器。 区别:从寄存数据的角度来看,寄存器和锁存器的功能是相同的,它们的区别在于寄存器是同步时钟控制,而锁存器是电位信号控制。 可见,寄存器和锁存器具有不同的应用场合,取决于控制方式以及控制信号和数据信号之间的时间关系:若数据信号有效一定滞后于控制信号有效,则只能使用锁存器;若数据信号提前于控制信号到达并且要求同步操作,则可用寄存器来存放数据。 12、IC设计中同步复位与异步复位的区别? 异步复位是不受时钟影响的,在一个芯片系统初始化(或者说上电)的时候需要这么一个全局的信号来对整个芯片进行整体的复位,到一个初始的确定状态。而同步复位需要在时钟沿来临的时候才会对整个系统进行复位。 13、多时域设计中,如何处理信号跨时域? 不同的时钟域之间信号通信时需要进行同步处理,这样可以防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响,其中对于单个控制信号可以用两级同步器,如电平、边沿检测和脉冲,对多位信号可以用FIFO、双口RAM、握手信号等。 跨时域的信号要经过同步器同步,防止亚稳态传播。例如:时钟域1中的一个信号,要送到时钟域2,那么在这个信号送到时钟域2之前,要先经过时钟域2的同步器同步后,才能进入时钟域2。 这个同步器就是两级d触发器,其时钟为时钟域2的时钟。这样做是怕时钟域1中的这个信号,可能不满足时钟域2中触发器的建立保持时间,而产生亚稳态,因为它们之间没有必然关系,是异步的。 这样做只能防止亚稳态传播,但不能保证采进来的数据的正确性。所以通常只同步很少位数的信号。比如控制信号,或地址。当同步的是地址时,一般该地址应采用格雷码,因为格雷码每次只变一位,相当于每次只有一个同步器在起作用,这样可以降低出错概率,象异步FIFO的设计中,比较读写地址的大小时,就是用这种方法。 如果两个时钟域之间传送大量的数据,可以用异步FIFO来解决问题。 我们可以在跨越ClockDomain时加上一个低电平使能的LockupLatch以确保Timing能正确无误。 14、给了reg的setup、hold时间,求中间组合逻辑的delay范围? Setup/hold time 是测试芯片对输入信号和时钟信号之间的时间要求。建立时间是指触发器的时钟信号上升沿到来以前,数据稳定不变的时间。 输入信号应提前时钟上升沿(如上升沿有效)T时间到达芯片,这个T就是建立时间-Setup time.如不满足setup time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿,数据才能被打入触发器。 保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。时hold time不够,数据同样不能被打入触发器。即delay
  • 热度 2
    2021-1-19 22:47
    1237 次阅读|
    0 个评论
    原文: https://zhuanlan.zhihu.com/p/342410727 第一部分:基本概念 1.关键字static的作用 (1)在函数体内:一个被声明为静态的变量,在这一函数被调用过程中,维持其值不变。(该变量值初始化一次) (2)在模块内,函数体外:一个被声明为静态的变量,可以被模块内所用函数访问,但不能被模块外其他函数访问。 (3)在模块内,一个被声明为静态的函数,该函数只能被这一模块内其他函数调用,其他模块无法调用。 2.引用与指针的区别: (1)引用必须初始化,指针不用 (2)引用初始化后不能修改,指针可以改变所指对象 (3)不存在指向空的引用,指针存在空值 指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。 引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。 关-注-公-众-号:嵌入式基地 回-复:【面试】 获-取-面-试-资-料 3..h头文件中的#ifndef/#define/#endif作用: 防止头文件被重复引用 4.#include 与#include “”区别: 是从系统指定的路径下寻找;””是先从当前路径下寻找 5.描述实时系统的基本特性: 在特定时间内完成特定的任务,实时性与可靠性。 6.全局变量与局部变量是否存在区别? 全局变量存在静态数据区,局部变量存在栈中 7.堆栈溢出一般是由于什么原因? (1)没有回收垃圾资源 (2)层次太深的递归调用 8.冒泡排序算法的时间复杂度 O(n^2) 9.什么函数不能声明为虚函数? 构造函数 10.队列与栈的区别: 队列:先进先出;栈:先进后出 11.不能做switch()的参数类型 实型 12.局部变量是否能和全局变量重名? 可以。局部变量会屏蔽全局变量。若要使用全局变量,使用::。 在函数内引用该重名变量时,会使用同名的局部变量,而不会使用全局变量(就近原则)。 对一些编译器而言,同一函数内可以定义多个同名的局部变量,例如:在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在该循环内。 13.如果引用一个已经定义过的全局变量? 可以包含其头文件,也可使用关键字extern。 引用头文件:通过引用头文件的方式来引用某个头文件中声明的变量,假如将该变量写错了,在编译阶段会报错。 Extern:通过extern的方式引用,若将变量写错,编译阶段编译器不会报错,在链接阶段会进行报错提示。 14.全局变量能不能定义在可被多个.c文件包含的头文件中? 可以。在不同的C文件中以static的形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是只能在一个C文件中对变量赋初值,此时链接不会报错。 15.for(;1;)有什么问题?什么意思? 与while(1)相同,无限循环 16.do…while()与while…do有什么区别? 前者循环一遍后再判断;后者先判断后循环 17.static全局变量、局部变量、函数与普通全局变量、局部变量、函数有什么区别? (1)static全局变量与非static全局变量区别: 存储方式上相同,都是静态存储。 作用域:非static全局变量的作用域在各个文件中都是有效的;static的全局变量作用域只限于当前源文件中,只初始化一次。 (2)static函数与普通函数作用域不同。Static函数只能在当前源文件中使用,而非Static函数可以在其他源文件中使用。 (3)static局部变量只初始化一次,下次调用使用上次的数值。 18.程序的内存分配 C/C++编译的程序占用的内存分为以下几部分。 (1) 栈区,编译器自动分配释放,存放函数的参数值,局部变量的值等。操作方式类似于数据结构中的栈。 (2) 堆区,由程序员分配释放。若程序员没有进行资源回收,程序结束时,可能会由OS回收。与数据结构中的堆是两回事。 (3) 全局区(静态区),全局变量与静态变量是存储在一起的。初始化的全局变量与初始化的静态变量在一块区域,未初始化的全局变量与未初始化的静态变量存储在一起。程序结束后由OS释放 (4) 常量区,存储常量,字符串。程序结束后由OS回收。 (5) 程序代码区,存放函数体的二进制代码。 示例: int a = 0; //全局初始化区域 char *p1; //全局未初始化区域 int main(int argc, char const *argv = “ssssss”; Char *s2 = “bbbbbb”; aaaaaa是在运行时赋值的,bbbbbb是在编译时确定的。 但在以后的存取中,栈上的数组比指针指向的字符串(堆)块。 void main() { char a = 1; char c ; a = p ; return; } 对应的汇编代码 10:a=c ; 004010678A4DF1movcl,byteptr 0040106A884DFCmovbyteptr ,cl 11:a=p ; 0040106D8B55ECmovedx,dwordptr 004010708A4201moval,byteptr 004010738845FCmovbyteptr ,al 第一种:在读取时,直接将字符串中的元素读到寄存器c1中 第二种:先将指针读取到edx中,再根据edx读取字符。 20.什么是预编译,什么时候需要预编译? 预编译又称为预处理,是做代码文本的替换工作,处理#开头的指令,比如拷贝#include包含的头文件代码;#define宏定义的替换。在程序开始编译之前进行。 C语言编译系统在对程序编译之前,先进行预处理。预处理主要提供以下功能: (1)宏定义(2)头文件包含(3)条件编译 21.关键字const含义 const 只读 应用: const int a; //常整型数 int const a; //常整型数 const int *a; //a是一个指向常整型数的指针(指针可以修改,整型数不可修改) int * const a; //a是一个指向整型数的常指针(指针不可以修改,整型数可以修改) const int * const a; //a是一个指向常整形数的常指针(都不可修改) 使用const关键字的理由: (1) 为读代码的人提供非常有用的信息,实际上应用一个参数为常量是为了告诉用户这个参数的应用目的。 (2) 通过给优化器一些附加信息,使用关键字const也许能够产生更紧凑的代码 (3) 合理使用const可以使编译器很自然的保护那些不希望被修改的参数,防止其被无意的代码修改。 22.关键字volatile含义?应用例子: 含义: 一个被定义为volatile的变量是说这个变量可能会被意想不到的改变,这样编译器就不会去假设这个变量的值了。准确的说,优化器在用到这个变量时,必须每次都小心点重新读取这个变量的值,而不是直接使用寄存器中的备份值。 应用: (1)并行设备的硬件寄存器 (2)一个中断服务子程序中会访问到的非自动变量。 (3)多线程应用中被几个任务共享的变量 其他问题: 1. 一个参数既可以是const还可以是volatile吗?为什么? 2. 一个指针可以是volatile吗 3. 下面函数有什么错误 Int square(volatile int *ptr) { Return *ptr * *ptr; } (1) 可以,一个例子为只读的状态寄存器。它是volatile是应为他可能被意想不到的改变。它是const是应为程序不因该去修改它。 (2) 是的,虽然不常见。一个例子为中断服务子程序修改一个指向一个buffer的指针时。 (3) 这段代码的目的是为了返回指针*ptr的平方,但是由于*ptr是一个指向volatile类型的参数,因此编译器将产生类似于下面的代码: int square(volatile int *ptr) { int a, b; A = *ptr; B = *ptr; Return a * b; } 由于*ptr的值可能被意想不到的改变,因此,a与b的值可能不同,结果这段代码返回的结果与预期可能并不相同。 正确代码: int square(volatile int *ptr) { int a; A = *ptr; Return a * a; } 23.三种基本数据模型 按照数据结构类型的不同,将该数据模型划分为层次模型、网状模型、关系模型 24.结构体与联合体有什么区别 共用体,允许在相同的内存地址存储不同的数据类型;可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同内存地址的方式 共用体,占用的内存应该足够存储共用体中最大的成员。 结构体,占用内存是内部所有变量所占空间之和。结构体,每个成员变量都有自己的内存地址。 25.#define与const区别: 1.const有数据类型,宏定义没有数据类型;编译器可以对前者进行安全检查,对于后者不能进行安全检查,只能进行字符替换。 2.有些调试工具可以对const进行调试,而宏定义无法调试。 3.const定义的常量有作用域,而#define不重视作用域,默认定义处到文件结尾。 26.数组与指针区别: 数组要么在静态数据区被创建,要么在栈上被创建。 指针可以随时指向任意类型的内存块。 (1)修改内容上的差别: char a = ‘x’; Char *p = “world”;//p指向的是常量字符串 P = ‘x’;//编译器无法发现该错误,运行时会报错 (2)使用sizeof()运算符计算容量: 数组可以使用sizeof计算出容量,而sizeof(p)计算得到的是一个指针变量的字节数,一般为4个字节,而不是p所指向的内存容量。 注意:当数组作为函数形参进行传递时,该数组自动退化为同类型指针: void TestBufferSize1(char a ) { printf("buffer size = %d \r\n", sizeof(a)); } int main(){ char b = "12345"; printf("b size = %d \r\n", sizeof(b)); TestBufferSize1(b); TestBufferSize2(b); system("pause"); } 27.分别写出bool、int、float、指针类型的变量a与零比较的语句: (1)bool: If(!a) or if(a) (2)int If(a == 0) (4)float: Const EXPRESSION EXP = 0.000001 If(a -EXP) (5)指针: If(a != NULL) or if(a == NULL) 28.如何判断一段程序是由c编译还是由c++编译程序编译的? #ifdef __cplusplus cout << "c++"; #else printf("c"); #endif 29.讨论含参数的宏与函数优缺点: 带参宏 函数 处理时间 编译时 程序运行时 参数类型 没有参数类型问题 定义实参,形参类型 处理过程 不分配内存 分配内存 程序长度 变长 不变 运行速度 不占用运行时间 调用和返回占用运行时间 30.使用两个栈来实现一个队列的功能 设两个栈A,B,并将其初始化为空 入队: 将新元素push入栈A; 出队: (1) 判断栈B是否为空 (2) 若不为空,则将栈A中的所有元素依次pop出,并push到栈B (3) 将栈B的栈顶元素pop出 这样的实现,入队与出队的平摊复杂度都为O(1) 31.位操作 给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a的bit 3。在以上操作中,保持其它位不变。 (1) 通过宏定义,以及bit masks操作。这种方法可移植性高 #define BIT3 (0x01 << 3) static int a; void SetBit3(void) { a |= BIT3; } void ClearBit3(void) { a &= ~BIT3; } (2) 使用bit fields。Bit fields是被扔到C语言死角的方式。这种方法保证了你的代码在不同编译器之间是不可移植的,同时也保证代码是不可重用的。 32.访问固定的内存位置 嵌入式编程中,经常会去访问某个特定内存位置的数据。在某个工程中,需要设置一个绝对地址为0x56a3的整型变量的值为0x3344。编译器是一个纯粹的ANSI编译器。 (1) 方法一: int *ptr = NULL; ptr = (int *)0x56a3; *ptr = 0x3344; (2) 方法二: *(int * const)(0x56a3) = 0x3344; 推荐使用第一种。 33.中断 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供了一种扩展—让标准C支持中断。 具体代表的事实是,产生了一个新的关键字__interrupt。 下面这段代码使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评价这段代码。 __interrupt double compute_area(double radius) { double area = PI * radius * radius; printf("\nArea = %f", area); return area; } (1) ISR不能返回一个值 (2) ISR不能传递参数 (3) 在许多编译器中,浮点数一般是不可重入的。并且,ISR应该是短而有效的,在ISR中做浮点数运算是不明智的。 (4) Printf()经常有重入与性能上的问题 34.typedef Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事情。 例: #define dPS struct s * Typedef struct s *tPS; 以上两种情况都是要定义dPS和tPS作为一个指向结构s的指针。哪种方法更好? 答:typedef更好,原因请看下面示例。 dPS s1,s2; tPS s3,s4; 第一个展开为struct s *s1,s2;此时,s1指向的是结构的指针,而s2是一个实际的结构。 35.写一个“标准”的宏 (1)交换两个参数的宏定义 #define SWAP(a, b)\ (a) = (a) + (b);\ (b) = (a) - (b);\ (a) = (a) - (b);\ (2)输入两个参数,输出较小的参数 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) (3)1年中有多少秒?(忽略闰年) #define SECONDS_OF_YEAR (60 * 60 * 24 * 365)UL (4)已知一个数组table,使用宏定义求出数组元素的个数 #define TABLE_SIZE (sizeof(table) / siezof(table ))
  • 热度 41
    2010-9-27 14:23
    6302 次阅读|
    20 个评论
    我应该是在2006年的样子才开始接触部门的面试工作,更早的时候都是老板(实际上是高级经理)自己面试,一开始时老板面试我旁听,过一段时间改为我问老板听,最后变成我单独问老板不管,就这样逐步负责起了部门的面试工作。 近几年也面试了不少人,说一些自己在面试工作中的感受,供大家参考。实际上公司人事部门有一份面试的指引文件,先让大家一 起看看的这个指引。 1. 面试准备 面试人在面试前应熟悉候选人的简历,提前记录好自己想问的问题。 2.面试步骤 2.1.开始,面试人应亲切友好,自我介绍并欢迎候选人,解释面试目的与过程的同时尽量让候选人放松,时间控制在5分钟内。 2.2.提问,所提问题紧扣工作内容,避免违反法律的言行,可适当进行专业问题现场测试,认真记录,时间控制在60~90分钟之间。 2.3.结束,询问候选人是否有问题要问,主动介绍有关工作的信息,最后感谢候选人参加面试,时间控制在10分钟左右。 3.面试总结 依据面试过程客观填写《面试评估表》并交人事部门负责后续工作,如可考虑录用应给出建议薪资范围。 面试大家最看重的就是结果,大多数时候面试结果是不会当场宣布的,是不是有希望被面试的人根本无法知晓,常出现谈得异常顺 利,最终却不录用的郁闷情况。接下来就我个人以往的面试经历,说说是如何应对面试,以便大家揣测面试官的真实想法。 1. 通常面试完毕都是说今天面试就到这里,谢谢你参与面试,接下来我们会依据你的面试结果和职位需求做综合评估,如果合适的话两周之内会通知你。这里的潜台词就是两周没通知就不用再等了,通常录用与否面试官当场就会定下来,只是不会直接告诉你,正常情况两三天就会通知。因为如果不合适,部门还需要继续新的面试,就会要人事部门接着提供简历,不可能等很长时间才反馈给人事部门的。如果觉得合适,面试官也担心好不容易遇到一个合适的,不尽早通知没准就去了另外的公司。 2.有时候也会遇到吃不准的情况,面试官自己也是打工的,谁都不能保证面试结果就一定准确,如果遇到吃不准的情况,面试官就会犹豫。如果该职位不急,面试官可能就直接否定,如果非常着急,为了避免承担面试评估不准的责任,面试官会推给他的上司做决定。这种情况就有可能需要再次面试,如果面试完面试官看似无意的说你某方面还不够, 回去后最好在多看看相关的知识,没准是在暗示你回去再针对这个面试准备准备 ,有可能需要再次面试。 3.基本上面试官都是喜欢听话的,谁愿意招进一个不听话的下属?所以面试中最好不要显露出太过自我的个性,如果让面试官感觉你是不大听话的人,估计就没什么希望了。除了听话,另外面试官也希望所招的人忠诚,招了你进去,他就希望那个你成为他的武器,如果有一天他和他的上司或老板意见不一的时候,只有忠诚他的人才用得上, 所以千万不要诋毁前任上司。 4.有工作经验的人,如果是技术能力比较强的, 最好只要表现出基本上符合职位要求即可,不要显现出自己还有更大的潜力和能力 ,谁都怕给自己招进来一颗**,如果你做一段时间后有可能超过面试你的人,他把你招进去不是自掘坟墓?刚工作的不用顾忌这一点,就算是**也不是马上就会炸的,面试官不会这么早就防着。呵呵,我也是这样的人,对那些被无辜砍掉的兄弟只能说抱歉啊。 5.如果自己觉得面试不理想,是可以主动询问面试官的,直接说自己感觉面试不好,应该满足不了职位的要求,看面试官能不能给自己一些建议,今后该在哪些方面加以注意。如果有笔试题不会的,同样也可以咨询面试官。对于这样的请求面试官一般不会拒绝,而且会给你面试印象正面加分,运气好没准你是面试官犹豫的人选,这一咨询就被录用。不知道是什么原因,对于这样的人,面试官会不自觉的增加信任度。 6.面试过程一定要谦虚再谦虚,而且还要能装,比如有一些技术问题, 就算大家公认简单,也不要脱口而出“这个问题很简单” 。只要面试官没说出来,你就不能说简单,就算面试官说了很简单,你也要说看起来时比较简单,但要做好不容易,这个说法永远是正确的。如果你说了简单,很有可能是对面试官所负责工作部分重要性的间接否定,结果就是这种简单活就不必麻烦您这样的高手出马了。 7.工作经历可以润色,但技术细节不要说大话,没做过的可以含混,千万不要改成做过, 接触和实际做过还是有一定区别的, 面试官不一定会当场戳穿你,但有可能是本来你是符合要求的,结果因此而否定。实际上招聘的那些要求,就是面试官自己都不一定能满足,唬人用的,面试官主要看的是你的技能和经验是不是和实际工作相适应,只是他不会告诉你,所以录用的并不是一定要笔试回答得非常好,不要自己给笔试主观定下合格标准。 8.如果你是一个工作年限已经比较长的人,还真的挺麻烦,我自己就是这一类,做题的面试基本不要过去, 一个有十年八年工作经验的人还要做C或汇编的题能有多大意义? 我的建议是先问清楚负责面试的人是谁,能给出的具体待遇,如果含糊其辞让你过去再说我看就别过去了,免得浪费时间。 9.最后推荐两本应付单片机程序员面试的书,《高效C++》和《程序员面试宝典》,虽然我个人比较反感笔试采用僵化的题目,但实际情况是许多公司的面试题目都是在这上面找的,既然现实是这样,你就得适应。 最怕招聘杀手,有可能是公司有某个职位的需求,但不着急要人用,这样的职位过去无疑是当炮灰,年前有个朋友推荐他同事去一 家公司面试,面试完对面试结果含糊其辞,只说还要等一段时间才能定下来。朋友想可能是想让他推荐的人和其它去面试的多做一 点对比,也没在意,那天朋友问这个事情的时候碰巧我在一起,他同事说去的时候秘书告诉他这个职位要求高,面试了两百多个都 没有合适的,我就知道是遇到了这种情况,果然,到现在还是说要继续等。 另一种招聘杀手就更可恨了,防不胜防。可能是公司根本就没有这个需求,在人才招聘网上发布消息权当打广告,让你过去面试就 是做个样子;也有可能是公司人事行政外包,人事行政部门为了应付公司用人需求,先忽悠你过去再说,后面的事情留给用人部门 去解决,结果发现用人部门根本就不需要你这样的人;还有可能是心理过于阴暗的人来面试,以技术砍人为乐,你回答的答案只能 在他认可的范围之内,一个答不出来,一番羞辱结束面试,一个答超标,会百般刁难直到问翻你,本来面试和被面试就是完全不对 等的地位,何必呢?
  • 热度 28
    2010-8-26 14:11
    6940 次阅读|
    4 个评论
    发现对C语言函数形参进行说明的文章点击率远高于其它文章,看来大家对C语言的热情可不是一般,难怪谭浩强教授那本C语言的书发行量能过千万册,显然是有坚实的群众基础。既然大家都偏好C语言的相关知识,今天我们来剖析一道C语言的面试题,这道题除了考察对C语言函数形参的理解外,还有对++这类操作先加还是后加掌握程度的考察。 题目见下,可以直接用VC进行编译运行,另外这道题也不是我出的,只是借来一用,不代表我完全认同其代码规范格式。 #include typedef struct{int b,p;}S; void f(S s) { int a="1",b=2,c=3,d=4,m=2,n=2; (m=ab)(n=cd); printf("m=%d,n=%d\n",n,m); s.b+=1; s.p+=2; } void fun(char *a,char *b) { a="b"; (*a)++; } void main(void) { int i; unsigned int array ,*p; char c1='A',c2='a',*p1,*p2; S s={1,2}; f(s); printf("%d,%d\n",s.b,s.p); p1=c1; p2=c2; fun(p1,p2); printf("%c%c\n",c1,c2); i="7"3+12; p="array"; *(p++)=++i; printf("%d\n",array ); *(p)=i++; *(p++)+=++i; printf("%d\n",array ); } 运行结果分析: void main(void) { int i; unsigned int array ,*p; char c1='A',c2='a',*p1,*p2; S s={1,2}; 完成main()函数中的变量初始化 没有特别需要注意的地方 假定结构s分配到的地址为s_main f(s); 进入函数fun(),main()函数中结构s的起始地址 s_main会传给函数fun() 进入函数fun()会先另外分配一段空间s_f,并把s_main的值传给s_f void f(S s) int a="1",b=2,c=3,d=4,m=2,n=2; 完成fun()函数中变量的初始化 (m=ab)(n=cd); 这里考察对运算符以及运算优先级别的理解 1.考察队=和运算符优先级的掌握程度,运算符优先级比=高 所以(m=ab)实际上为(m=(ab)),先执行ab操作,此时a=1,b=2,执行结果不为真,也就是m=0,m的值从2变为0 (n=cd)同理,如果执行完(n=cd)应该是n的值从2变为0 2.考察对运算符的理解,因为是条件与,如果前一个条件不为真,就不会进行后面的处理 因为(m=ab)得结果是m=0,所以不用再进行其右边的运算,(n=cd)没有执行,n的值保持不变 printf("m=%d,n=%d\n",n,m); 到这里m的值为0,n为2,正常输出即可 留意这里会额外考察面试者看题的细致程度,输出格式交换了m和n,最终输出应为“m=2,n=0” s.b+=1; s.p+=2; 这里的s实际上是s_f.b加1和s_f.p加2,s_main.b和s_main.p的值均保持不变 这就是之前我分析的形参的处理方法,可以将其当成函数的局部函数,调用时从别处取到初始值 printf("%d,%d\n",s.b,s.p); 这里考察的是对函数形参的理解 到这里函数f()已经执行完返回到main()函数中,函数f()中使用的s_f已经释放掉 所以输出实际还是没有改变的s_main.b和s_main.p,最终输出为“1,2” p1=c1; p2=c2; fun(p1,p2); 这里也是考察队函数形参的理解,不过这里的参数是指针,所以结果会和前面的f()有所不同 void fun(char *a,char *b) 进入函数时候fun()也会分配两个指针a_fun和b_fun 调用函数fun()会先将p1_main和p2_main的值传递给a_fun和b_fun a="b"; 这一句执行结果是a_fun从p1_main变为b_fun,也就是p2_main (*a)++; 指针操作,此时a_fun等于p2_main,指向main()中c2所在的地址,实际结果为将c2所在的地址的内容加1 printf("%c%c\n",c1,c2); 因为前面将c2所在的地址的内容加了1,实际上就是c2内容已经被加了1,最终输出应为“A,b” 对比函数f(),作为形参的p1和p2内容同样没有改变,但是函数fun()中改变了指针所指向地址的内容,从而改变了main()函数中的相应内容 i="7"3+12; 考察的是对运算符的掌握程度,实际等效为i=7(3+12)=7 p="array"; 取数组的首地址给指针p *(p++)=++i; 考察对i++和++i这类操作的理解,p先用再加,i先加再用,实际等效为下面 i="i"+1;这里i变为8 (*p)=i;这里p指向array 的地址,所以array 变为8 p="p"++;这里p改指向array 的地址 printf("%d\n",array ); 最终输出应为“8” *(p)=i++; i先用再加,实际等效为下面 (*p)=i;此时i依然为8,p指向array ,所以array 变为8 i="i"+1;i的内容变为9 *(p++)+=++i; p先用再加,i先加再用,实际等效为下面 i="i"+1;i的内容变为10 (*p)=(*p)+i;此时p指向array ,i为10,array 为8,执行结果是array 变为18 p="p"+1; printf("%d\n",array ); 最终输出应为“18” } (全文完)
相关资源
  • 所需E币: 0
    时间: 2022-12-3 13:32
    大小: 3.17MB
    上传者: jxh_first
    本文档是传智播客整理的一些算法和数据结构和数据库等的面试题
  • 所需E币: 5
    时间: 2022-1-4 14:51
    大小: 1.18MB
    上传者: 益溪之辰
    常见硬件工程师面试题汇总
  • 所需E币: 5
    时间: 2019-12-24 21:50
    大小: 171.12KB
    上传者: givh79_163.com
    想成为嵌入式程序员应知道的0x10个基本问题C语言测试:想成为嵌入式程序员应知道的0x10个基本问题C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。如果上述任何问题的答案是“是”的话,那么我知道我得认真考虑我是否应该去做这份工作。从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。预处理器(Preprocessor)1.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defineSECONDS……
  • 所需E币: 5
    时间: 2019-12-24 14:33
    大小: 134.36KB
    上传者: 16245458_qq.com
    FPGA面试题1、同步电路和异步电路的区别是什么?(仕兰微电子)异步电路主要是组合逻辑电路,用于产生地址译码器、FIFO或RAM的读写控制信号脉冲,但它同时也用在时序电路中,此时它没有统一的时钟,状态变化的时刻是不稳定的,通常输入信号只在电路处于稳定状态时才发生变化。也就是说一个时刻允许一个输入发生变化,以避免输入信号之间造成的竞争冒险。电路的稳定需要有可靠的建立时间和持时间,待下面介绍。同步电路是由时序电路(寄存器和各种触发器)和组合逻辑电路构成的电路,其所有操作都是在严格的时钟控制下完成的。这些时序电路共享同一个时钟CLK,而所有的状态变化都是在时钟的上升沿(或下降沿)完成的。比如D触发器,当上升延到来时,寄存器把D端的电平传到Q输出端。在同步电路设计中一般采用D触发器,异步电路设计中一般采用Latch。2、什么是同步逻辑和异步逻辑?(汉王笔试)同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。电路设计可分类为同步电路和异步电路设计。同步电路利用时钟脉冲使其子系统同步运作,而异步电路不使用时钟脉冲做同步,其子系统是使用特殊的“开始”和“完成”信号使之同步。由于异步电路具有下列优点--无时钟歪斜问题、低电源消耗、平均效能而非最差效能、模块性、可组合和可复用性--因此近年来对异步电路研究增加快速,论文发表数以倍增,而IntelPentium4处理器设计,也开始采用异步电路设计。3、什么是"线与"逻辑,要实现它,在硬件特性上有什么具体要求(汉王笔试)线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用oc门来实现(漏极或者集电极开路),由于不用oc门可能使灌电流过大,而烧坏逻辑门,同时在输出端口应加一个上拉电阻。(线或则是下拉电阻)4、什么是Setup和……