#define SECONDS_PER_YEAR (60*60*24*365)UL
(因为数值超过65535,产生溢出,因此需要用到长整型,而且不会是负数,所以使用无符号整型UL)
a:while(1){循环体}
b:for(;;){循环体}
c:Loop:循环体 goto Loop
a:一个整型
b:一个指向整型的指针
c:一个指向指针的指针
d:一个指向10个整型数的数组
e:一个指向有10个整型指针的数组
f:一个指向有10个整型数数组的指针
g:一个指向函数的指针,该函数有一个整型参数并返回一个整型数
h:一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
答案:
1 a) int a; 2 b) int *a; 3 c) int **a; 4 d) int a[10]; 5 e) int *a[10]; 6 f) int (*a)[10]; 7 g) int (*a)(int); 8 h) int (*a[10])(int);
a:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
b:在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
c:在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
a:Const int a; a是一个常整型数
b:int const a; a是一个常整型数
c:const int *a; a是一个指向常整型数的指针(整型数是不可修改的,但指针可以)
d:int * const a; a是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)
e:int const * a const; a是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
一个参数既可以是const还可以是volatile,一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它
写两段代码:第一段代码进行置位操作:(寄存器)的bit3,第二段代码进行清位操作:(寄存器)的bit3
1 #define BIT3 (0x1<<3) 2 static int a; 3 void set_bit3(void) 4 { 5 a |= BIT3; 6 } 7 void clear_bit3(void) 8 { 9 a &= ~BIT3; 10 }
1 int *ptr; 2 ptr = (int *)0x67a9; 3 *ptr = 0xaa55;
中断是嵌入式系统中重要的组成部分,ISP(中断服务子程序) 注意点:
a:ISR 不能返回一个值
b:ISR 不能传递参数
c:在许多的处理器/编译器中,浮点一般都是不可重入的,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
d:与第三点一脉相承,printf()经常有重入和性能上的问题
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型
1 Void foo(void) 2 { 3 unsigned int a = 6; 4 int b = -20; 5 (a+b > 6) puts("> 6") : puts("<= 6"); 6 }
1 unsigned int zero = 0; 2 unsigned int compzero = 0xFFFF; 3 /*1‘s complement of zero */ 4 5 对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下: 6 7 unsigned int compzero = ~0;
1 Char *ptr; 2 if ((ptr = (char *)malloc(0)) == NULL) 3 puts(“Got a null pointer”); 4 else 5 puts(“Got a valid pointer”); 6 7 代码的输出是“Got a valid pointer
假设目的要定义dPS 和 tPS 都是一个指向结构s指针
1 #define dPS struct s * 2 typedef struct s * tPS; 3 4 dPS p1,p2; 5 tPS p3,p4; 6 7 第一个扩展为: 8 struct s * p1, p2;
上面的代码定义p1为一个指向结构的指针,p2为一个实际的结构,显然错误了。第二个例子正确地定义了p3 和p4 两个指针。
1 Int a = 5, b = 7, c; 2 c = a+++b;
实际为:c = a++ + b
程序运行后结果为:a = 6、b = 7、c = 12
原文:https://www.cnblogs.com/ksht-wdyx/p/13523207.html