在C语言复习讲义中,我们遇到一个关于标识符和变量类型的题目。在提供的程序片断中,`#define p 2.5` 定义了一个预处理器宏,将标识符`p`关联到一个双精度浮点型常量`2.5`。在`main()`函数中,声明了一个`float`类型的变量`x`,然后将`p`赋值给了`x`,这表明`p`在这里实际上代表的是一个`float`型变量的值,尽管它最初被定义为一个`double`型常量。
1. 关于常量,错误的选项是C,因为浮点数常量应该有后缀`f`或`F`,如`2.5f`,而不是`2.5`。
2. 不合法的标识符是A `_256`,因为标识符不能以数字开头,而其他选项(scanf, void, Struct)都是合法的。
3. 要求两个操作数都必须是整数的运算符是D `%`,因为它是取余运算符,仅用于整数除法。
4. 对于表达式`t=1, t+5, t++`,由于`t`是`double`类型,而`1`默认为`double`类型的常量,因此`t=1`的值为`1`。加上`5`后得到`6`,再自增`1`,最终`t`的值为`7`。答案是C。
5. 错误的选项是D,声明变量时虽然必须指定数据类型,但存储类型(如静态、自动或外部)可以省略,但必须明确。
6. 与`while(e)`等价的表达式是A `e==0`,因为当条件为`false`时,循环会结束,而`e>0||e<0`意味着只要`e`不为零就会继续,不符合while循环的退出条件。
7. 程序段中的逻辑运算符`||`短路,即只要满足其中一个条件就执行,所以`++x`总是执行,不会影响`++y`和`++z`,因此输出为`(1,1,1)`,答案是A。
8. 为了避免嵌套if语句的二义性,C语言规定与`else`配对的if是C,即`else`之后最近的未配对的`if`。
9. 在数组初始化中,合法的选项是C,`++(a[0]+1)`,它先计算`a[0]+1`得到数组的下一个索引,然后递增该值。
10. 选项D `q[1][2]`试图访问数组`a`中的元素,但`q`是一个指向一维数组指针的指针,所以`q[1]`是二维数组的一行指针,而不是实际元素,因此不能输出6,答案是D。
11. 函数`fun(float x, double y)`的返回值类型由函数声明决定,因为没有指定返回类型,C语言会隐式推断为与最后一个参数类型相同的类型,即`double`,答案是A。
12. 当一维数组作为实参传递时,函数接收到的是整个数组的地址,因此对应形参接收的是该数组的第一个元素的值,答案是B。
总结了以上知识点,本讲义部分主要涉及C语言的常量、标识符、运算符、变量声明和作用、函数返回值类型以及数组传递的含义。