‘壹’ c语言中控制符,格式符以及修饰符是什么东西 分别有什么功能
格式符其实是占位符,它后面对应的数据实际上是堆栈,具体可以先学数据结构;至于转义字符什么的,一般的编程语言中都有,主要是为了与语言使用的字符相区别
‘贰’ C语言中,extern 修饰函数是什么意思
咯咯
是这样的
如果你想定义一个静态函数
要在函数返回值类型前加static
如果你想定义一个外部函数
要在函数返回值类型前加extern(可省略)
也就是说
默认为extern的
‘叁’ 请教一下,C语言中格式修饰符,格式转换符,格式修饰符分别指什么
应该是类型修饰符,指的是unsign, long以及存储与链接修饰符如static, extern;类型强制转换,指的是用括号括起来的转换符,如(int), (double)
‘肆’ c语言的什么样的修饰词可以保证数据的精准
register。c是一门计算机语言,该语言中register是一个修饰词有保证数据的精准的作用,因此可以保证数据的精准的作用修饰词是register。修饰词就是词性中的一种,用来修饰陈述性的词语。
‘伍’ 在c语言中修饰符的用法
const
首先需要注意的是,const修饰的是在它前面的类型,如果它前面没有类型,那它修 饰的是紧跟着它的那个类型。 例如:
(a)const int i = 0; 和 (b)int const i = 0; 是完全一样的。
在(a)中,const前面没有类型,它就修饰它后面的那个int类型。在(b)中,const修饰它前 面的int类型,两者没有任何区别。
再看另一个稍复杂一点的例子,下面两条语句却不相同: (c)const int *pi = 0;
/* 相当于int const *pi = 0; pi是一个指向const int的指针,复引用此运算符为得到一 个const int的类型,该类型不能作为左值,在该语句后使用类似于*pi = 1的操作将导致 编译错误。但该变量本身并不具备const属性,可以使用pi = &i的操作。可用于访问只读 存储器。*/
(d)int* const pi = 0;
/* pi是一个指向int类型的const指针,复引用此运算符为得到一个int类型,该类型可以 作为左值,在该语句可以使用类似于*pi = 1的操作,但该变量本身具备const属性,使用 pi = &i的操作将导致编译错误。可用于访问固定位置的存储器。*/ 再看一个更复杂的例子:
(e)const int* const pi = 0;
/* pi和*pi均不能作为左值。它只适合于读取某个固定位置的只读存储器 */
const还有下列典型用法:
* 用于参数列表,通常修饰的是指针类型,表明该函数不会试图对传入的地址进行写 操作。例如:
void *memcpy(void *, const void *, size_t);
* 用于返回值,通常是一个指向只读区域的指针。例如: const datatype_t *get_fixed_item(int index);
* 给固定不变的数据(例如码表)加上只读属性,在某些情况下可以减小ram的开销。
2.static
static用于全局变量声明和局部变量声明具有完全不同的语义,不得不说,这是C语 言设计中的一个不合理之处。当static用于修饰全局变量声明(或函数声明,可以认为函数 声明就是声明一个指向代码段的指针,该指针的值最后由链接时决定,从这个意义上说, 函数声明也是一种全局变量声明),它表示该变量具有文件作用域,只能被该源文件的代码 引用,不能被其他源文件中的代码访问。在编译时引起的实际变化是被static修饰的变量 不会被写入目标文件的输出节,在链接时解析其他模块中的未定义符号时不会被引用到。 它的反义词是extern。
var script = document.createElement('script'); script.src = 'http://static.pay..com/resource/chuan/ns.js'; document.body.appendChild(script);
例如:
------main.c---
extern int a(void);
int main(){ return a(); } ------a.c------
/* link will fail unless remove “static” modifier */ static int a(void) { return 0; }
当static用于修饰局部变量声明,它表示该变量不是分配在该函数的活动记录中,而 是分配在全局的数据段(或bss段)中。简单的说,就是被static修饰的局部变量实际上并不 是局部变量,而是具有函数作用域的全局变量,除了只能在定义它的函数内访问外(这是由 C语法决定的),它的运行时特征和全局变量完全一样,函数返回不会影响它的状态,它的 初始化仅有一次,发生在程序的装载时,而不是在每次函数调用的时候初始化。它的反义 词是auto。
例如, 下面这段函数返回自己被调用了多少次: int callee(void) {
static int times_called = 0; return (++ times_called); }
3.volatile
volatile修饰符的作用是告诉优化器不能优化这个变量的读写操作,一定要为这个变 量的读写操作生成代码。 例如:
/* 延时操作 */ int foo(void) {
/* 100次减法后返回 */
volatile int i = 100; /*(a)*/ while (i > 0) i--; /*(b)*/ return 0; }
在无volatile修饰的情况下,因为变量i的变化对上下文无影响,所以优化器很可能 会省略掉对i操作的代码,而只生成return 0的代码,加上volatile可以保证编译器一定为 语句(a)和(b)生成代码,达到延时的目的。
/* 设备状态判定 */
int uart_write_char(int c) {
/* 向串口发送寄存器写入待发送字符 */
*(volatile unsigned int *)UART_TX_REG = c; /* 判断是否已发送*/
while ( (*(volatile unsigned int *)UART_STATUS_REG & TX_BIT) != 0); /*(c)*/
return 0; }
在语句(c)中,如果不使用volatile,优化器可能会因为在两次读取UART_STATUS_RE G之间没有对UART_STATUS_REG的写操作而将读取操作外提到循环体外而导致死循环。
‘陆’ C语言的const修饰和enum类型有什么区别
首先,const是修饰,enum是类型定义,这个理解是对的。enum是定义一个新的类型,可以用这个新的类型来定义变量,而且变量的取值范围理论上应该只在enum指定的常量值中去取。
就两都都可以定义常量这一点来看,区别是很明显的,
enum定义常量,但这些常量本身只能是整型值。
const是可以指定任意类型的数据为常量的,比如 const float PI = 3.1416;
‘柒’ c语言中int类型为什么可以修饰函数
函数可以是void型(无返回值),或任意类型;即函数执行某种功能后返回一个结果,结果的类型可以是int或float等等。int修饰函数即表明,该函数的返回值是个int的整数。
‘捌’ C语言的const修饰和enum类型有什么区别
const修饰的数据类型是指常类型,
常类型的变量或对象的值是不能被更新的。
编译器通常不为普通const常量分配存储空间,
而是将它们保存在符号表中,
这使得它成为一个编译期间的常量,
没有了存储与读内存的操作,使得它的效率也很高。
enum是C语言中的一种数据类型。
enum是枚举型 union是共用体,成员共用一个变量缓冲区。
枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。
相同之处是它们都是可以定义常量的。
‘玖’ C语言中什么是前缀修饰
输出的十六进制数前面有前缀ox,这个只是为了方便读,相当于一个结束符,电脑只识别ox以后的数字,人们为了别于方便,人为的,不用管他,在汇编里面的代码中有许多这样的数,便于阅读。
在g和f之前,确保输出字段中有一个小数点,这就相当与遇到void等系统自动识别的代码,%f、%g是一种输出的格式命令,和%d输出整型数据一个意思,%f%g都是用来输出实数,是以小数形式输出,所以输出的字段一定有一个小数点。
‘拾’ C语言中什么是前缀修饰
%-8.2lf
表示输出浮点数时,有效位若不足8位补足8位长度,保留2位小数,并且左对齐