12、下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts(\”> 6\”) : puts(\”<= 6\”);
}
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。
解答:
除了有符号类型和无符号类型混合使用时自动转换为无符号类型,较小的类型和较大的类型混合使用会被转换成较大的类型,防止数据丢失。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (void)
{
int a = 10;
printf (\”sizeof ((a > 5) ? 4 : 8.0) = %dn\”, sizeof ((a > 5) ? 4 : 8.0));
return 0;
}
输出结果:
sizeof ((a > 5) ? 4 : 8.0) = 8
13、评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1\’s complement of zero */
对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
unsigned int compzero = ~0;
14、尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?
(1)越界,理论上可以申请4G,但超过程序内存的大小就会返回空指针,所以要检查返回的指针是否为空。
(2)用完记得释放,以免内存泄漏。 还有使用的过程中不要指针越界,这样会导致致命错误。
(3)使用 free 或 delete 释放了内存后,没有将指针设置为 NULL。导致产生“野指针”。
解答:
函数用法:
type *p;
p = (type*)malloc(n * sizeof(type));
if(NULL == p)
/*请使用if来判断,这是有必要的*/
{
perror(\”error…\”);
exit(1);
}
…/*其它代码*/
free(p);
p = NULL;/*请加上这句*/
函数使用需要注意的地方:
1、malloc 函数返回的是 void * 类型,必须通过 (type *) 来将强制类型转换。
2、malloc 函数的实参为 sizeof(type),用于指明一个整型数据需要的大小。
3、申请内存空间后,必须检查是否分配成功
4、当不需要再使用申请的内存时,记得释放,而且只能释放一次。如果把指针作为参数调用free函数释放,则函数结束后指针成为野指针(如果一个指针既没有捆绑过也没有记录空地址则称为野指针),所以释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
5、要求malloc和free符合一夫一妻制,如果申请后不释放就是内存泄漏,如果无故释放那就是什么也没做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
15、typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?
typedef更好
解答:
首先你要了解 typedef 和 define 的区别,宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。
上面两种情况,从形式上看这两者相似,但在实际使用中却不相同。
dPS p1,p2;
在宏代换后变成: struct s* p1, p2; 定义p1为一个指向结构的指针,p2为一个实际的结构。
tPS p3,p4;
而typedef代换后,正确地定义了p3 和p4 两个指针。
总结,typedef和#define的不同之处:
1、与#define不同,typedef 给出的符号名称仅限于对类型,而不是对值。
2、typedef 的解释由编译器,而不是是处理器执行。
3、虽然它的范围有限,但在其受限范围内,typedef 比 #define 更灵活。
16、C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?
int a = 5, b = 7, c;
c = a+++b;
上面的例子是完全合乎语法的。
#include <stdio.h>
int main (void)
{
int a = 5,b = 7,c;
c = a+++b;
printf (\”c = %dn\”, c);
return 0;
}
输出结果:
c = 12
c = a+++b;
可以看做:
c = a++ + b;
或者
c = a + ++b;
两者结果是不同的。
++ 自增运算符 为单目运算符 结合方向 是从右到左;+ 加 双目运算符 结合方向 从左到右;++ 优先级 高于 +。
上面的代码被编译器处理成:
c = a++ + b;
学习编程(C语言/C++)并不难各位可以加下群466572167(资料和视频),一起交流提升,编程不要觉得很难,虽说也有难度,但是学好了对以后的帮助是非常大。
