14.函数返回地址和堆栈帧
void* __builtin_return_address(unsigned int level);
void* __builtin_frame_address(unsigned int level);
15.标识符
标识符可以包含美元符号$.
16.整数
long long int a; //Singed 64-bit integer
unsigned long long int b; //Unsigned 64-bit integer
a = 8686LL;
b = 8686ULL;
17.更换关键字
命令行选项-std和-ansi会使关键字asm,typeof和inline失效,但是在这里可以使用他们的
替代形式__asm__, __typeof__和__inline__
18.标识地址
可以使用标识来标记地址,将它保存到指针中,再用goto语句跳转到标记处.可通过&&操作符
返回地址.而对表达式得出的所有空指针,使用goto语句可进行跳转.
例如:
#include <stdio.h>
#include <time.h>
int main(void)
{
void* target;
time_t noe;
now = time((time_t*)NULL);
if (now & 0x1)
target = &&oddtag;
else
target = &&eventag;
goto *target;
enentag:
printf("The time value %ld is even\n", now);
return 0;
oddtag:
printf("The time value %ld is odd\n", now);
return 0;
}
19.局部标识声明
使用关键字__label__说明标识为局部标识,然后在该范围内使用.
{
__label__ restart, finished; //声明两个局部标识
...
goto restart;
}
20.左值表达式
赋值操作符的左边可以使用复合表达式.
例如:
(fn(), b) = 10; //访问复合表达式的最后一个成员变量的地址
和fn(), (b = 10);相同
ptr = &(fn(), b); //取复合表达式的最后一个成员的地址, ptr指向b
((a>5)?b:c) = 100; //条件表达式也可作为左值, 如果a大于5,则b的值是100,否则c的值是100
21.可变参数的宏
ISO C99创建宏的变参宏如下:
#define errout(fmt,...) fprintf(stderr, fmt, __VA_ARGS__)
GCC支持上面形式,同时支持下面形式:
#define errout(fmt,args...) fprintf(stderr, fmt, args)
22.字符串
一行新的字符可以被嵌入到字符串中,而不需要使用转义符\n.可按照字面意思将他们包含在源码中.
例如:
char* str1 = "A string on\ntwo lines";
char* str1 = "A string on
two lines";
上面两个字符串等价.
字符串换行符\可以省略.
例如:
char* str3 = "The string will \
be joined into one line.";
char* str4 = "The string will
be joined into one line.";
上面两个字符串等价.
23.指针运算
支持void和函数指针加减运算,进行运算的单位是1.
24.Switch和Case分支语句
例如:
支持 case 8 ... 10:
25.typedef
关键字typedef可根据表达式的数据类型创建数据类型.
typedef name = expression;
例如:
typedef smallreal = 0.0f;
typedef largereal = 0.0;
smallreal real1;
largereal real2;
类型smallreal为单精度浮点类型, 而largereal为双精度浮点类型.
#define swap(a,b) \
({ typedef _tp = a; \
_tp temp = a; \
a = b; \
b = temp; })
26.typeof
关键字typeof可以声明类型表达式.用法与sizeof类型, 但是结果是类型而不是size.
例如:
char* pchar; //A char pointer
typeof (*pchar) ch; //A char
typeof (pchar) pcarray[10]; //Ten char pointers
27.联合体强制类型转换
如果数据项和联合体中成员类型相同,可以将数据项强制转为联合.
例如:
union dparts {
unsigned char byte[8];
double dbl;
};
double v = 3.1415;
printf("%02X", ((union dparts)v).byte[0]);
但是联合强制类型转换的结果不能作为左值.
例如:
(union dparts)v.dbl = 1.2; // Error
3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.net/exam/