一些有趣的C语言题目

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35769746/article/details/81978769

问题2:写一个“标准”宏,这个宏输入两个参数并返回较小的一个

答:#define MIN(x,y)((x)<(y)?(x):( y))//结尾没有; (注意几个括号)

问题3:#与##的作用?

答:#是把宏参数转化为字符串的运算符,##是把两个宏参数连接的运算符。

例如:

#define STR(arg)#arg则宏STR(你好)展开时为“你好”

#define NAME(y)name_y则宏NAME(1)展开时仍为name_y

#define NAME(y)name _ ## y则宏NAME(1)展开为name_1

#define DECLARE(name,type)typename ## _ ## type ## _ type,

则宏宏DECLARE(val,int)展开为int val_int_type

15 Typedef在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
以上两种情况的意图都是要定义dPS和tPS作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?
这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:
dPS p1,p2; // p1为结构体指针   p2为结构体
tPS p3,p4; // p3 p4为结构体指针
第一个扩展为
struct s * p1,p2;
上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3和p4两个指针。晦涩的语法

问题4:结构体成员数组大小为0
结构体数组成员的大小为0是GNU C的一个特性。好处是可以在结构体中分配不定长的大小。如
typedef struct st
{
    inta;
    int b;
    char c[0];
}st_t;
sizeof(st_t)等于8,即char c[0]的大小为0.
34、位操作(Bit manipulation)

答: 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
对这个问题有三种基本的反应
1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。
2) 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。
3) 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:

#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void) 
{
    a |= BIT3;
}
void clear_bit3(void) 
{
    a &= ~BIT3;
}
    一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。

猜你喜欢

转载自blog.csdn.net/qq_35769746/article/details/81978769