zoukankan      html  css  js  c++  java
  • 嵌入式笔试题

    1. 考查逗号表达式

      

    main() 
    { 
    int a, b,c, d; 
    a=3; 
    b=5; 
    c=a,b; 
    d=(a,b); 
    printf("c=%d" ,c); 
    printf("d=%d" ,d); 
    } 
    这段程序的输出是: 
    (a) c=3 d=3 
    (b) c=5 d=3 
    (c) c=3 d=5 
    (d) c=5 d=5 

    应该选C。

    c语言提供一种特殊的运算符,逗号运算符,优先级别最低,它将两式联接起来,如:(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14。(a=3*5,a*4)的值是60。
    逗号表达式的形式如下:
    表达式1,表达式2,表达式3,...... ,表达式n
    逗号表达式的要领:
    (1) 逗号表达式的运算过程为:从左往右逐个计算表达式。
    (2) 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。
    (3) 逗号运算符的优先级别在所有运算符中最低。
    题目:以下程序的输出结果是:
    main()
    {
    int x,y,z;
    x=y=1;
    z=x++,y++,++y;
    printf("%d,%d,%d
    ",x,y,z);
    }
    [A]2,3,3 [B]2,3,2 [C]2,3,1 [D]1,1,1
    解析:
    x和y的值经过自增以后分别为2和3,D可以排除。剩下3个选项选择什么呢?
    如果是(x++,y++,++y)实际上可以看成(1,1,3)整个逗号表达式的值应该是3,那么选A。
    如果是(x++,++y,y++)实际上可以看成(1,2,2)整个逗号表达式的值应该是2,那么选B。
    但这是错的,这儿还有赋值运算符赋值运算符的优先级是14,而逗号表达式的优先级是15,也就是说上面的表达式中应该等价于这样的结合:(z=x++),y++,++y;如果这样写的话,则答案很清晰,为:2,3,1
    正确答案选C。
     

    考查自加操作(++)

    main() { int i=3; int j; j = sizeof(++i+ ++i); printf("i=%d j=%d", i ,j); } 这段程序的输出是: (a) i=4 j=2 (b) i=3 j=2 (c) i=3 j=4 (d) i=3 j=6

    选C。参考 sizeof用法汇总

    此题考查的是C的变长参数

    #include<stdarg.h> int ripple ( int , ...); main() { int num; num = ripple ( 3, 5,7); printf( " %d" , num); } int ripple (int n, ...) { int i , j; int k; va_list p; k= 0; j = 1; va_start( p , n); for (; j<n; ++j) { i = va_arg( p , int); for (; i; i &=i-1 ) ++k; } return k; } 这段程序的输出是: (a) 7 (b) 6 (c) 5 (d) 3

    选C。

    在C编译器通常提供了一系处理可变参数的宏,以屏蔽不同的硬件平台造成的差异,增加程序的可移植性。这些宏包括va_start、 va_arg
    和va_end等。
    采用ANSI标准形式时,参数个数可变的函数的原型声明是:
    type funcname(type para1,type para2, ...)
    这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分。type是函数返回值和形式参数的类型。
    不同的编译器,对这个可变长参数的实现不一样 ,gcc4.x中是内置函数.
    关于可变长参数,可参阅
    http://www.upsdn.net/html/2004-11/26.html
    http://www.upsdn.net/html/2004-11/24.html

    程序分析
    va_list p; /*定义一个变量,保存  函数参数列表 的指针*/
    va_start( p , n); /*用va_start宏 初始化 变量p,
    va_start宏的第2个参数n  ,
    是一个固定的参数,
    必须是我们自己定义的变长函数的最后一个入栈的参数
    也就是调用的时候参数列表里的第1个参数*/
    for (; j<n; ++j) /* j从1开始,  遍历所有可变参数 */
    {
    i= va_arg( p , int);   /*va_arg取出当前的参数,
    并认为取出的参数是一个整数(int) */
    for (; i; i &=i-1) /*判断取出的i是否为0*/
    ++k;   /* 果i不为0, k自加,
    i与i-1进行与逻辑运算, 直到i 为0
    这是一个技巧,下面会谈到它的功能*/
    }
    当我们调用ripple函数时,传递给ripple函数的 参数列表的第一个参数n的值是3 .
    va_start 初始化p士气指向第一个未命名的参数(n是有名字的参数),也就是 is 5(第一个).
    每次对 va_arg的调用,都将返回一个参数,并且把 p 指向下一个参数.
    va_arg 用一个类型名来决定返回的参数是何种类型,以及在 var_arg的内部实现中决定移动多大的距离才到达下一个 参数
    (; i; i&=i-1) k++ /* 计算i有少bit被置1*/
    5用二进制表示是 (101) 2
    7用二进制表示(111) 3
    所以k 返回 5(2+3),也即本题应该选c
    举个例子,就很好理解了
    令  i= 9 = 1001
    i-1= 1000
    (i-1) +1 = i
    1000
    +1
    1 001
    因为i与i-1的最右边的那位(最低位) 肯定是不同,如果i1,i-1肯定是0,反之亦然.    i& i-1 这个运算,在二相补的数字系统中,将会
    消除最右边的1位

    • 求一个数中1的个数

    参考 http://blog.chinaunix.net/uid-26922071-id-3799818.html

    #include <stdio.h>
    
    int main(int argc, const char *argv[])
    {
        int i = 9;
    
        int k = 0;
    
        while(i)
        {
         i&=(i-1); k
    ++; } printf("k=%d ",k); return 0; }
  • 相关阅读:
    C# 访问AD查询用户信息
    js UTC时间转本地时间
    Silverlight中的序列化和反序列化
    ASP.NET FORM认证配置排错记录
    opencv中cvSetData用法
    WS2812B-64位 8*8位 RGB LED点阵
    1602 LCDKeypad Shield
    Wemos D1 使用ESP8266 板载存储
    Wemos D1 ESP8266的网络工作模式
    Wemos D1 1602 液晶屏幕
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3195033.html
Copyright © 2011-2022 走看看