1

1
2
3
4
5
6
7
#include <stdio.h>
int main() {
int i = 1;
sizeof(i++);
printf("%d\n", i);
return 0;
}

输出等于1

根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义,sizeof(i++); 在编译的时候被翻译成 sizeof((i++的数据类型)) 也就是 sizeof(int); 不会执行i++了 。

sizeof是操作符

2

下面说法中正确的是()

  • 若全局变量仅在单个C 文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度
    
    1
    2
    3

    - ```
    若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度
  • ```
    设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑变量生命周期问题

    1
    2
    3

    - ```
    静态全局变量使用过多,可那会导致动态存储区(堆栈)溢出

Static 函数在非类中有三个作用:

1、用来隐藏,利用这一特性,可以在不同的文件中定义同名变量和同名函数,而不用担心命名冲突,对应A选项;

2、默认初始化为0;

3、保持局部变量的持久 。所以A选项是对的。B选项毫无关系,C选项中动态全局变量、静态全局变量、静态局部变量生命期都为函数运行期间。 其中静态局部变量的生存周期虽然为整个源程序,但是其作用域任然与局部变量相同,当退出该函数时,该变量还继续存在,但是不能使用它。所以C选项是错的。 D选项中,静态全局变量存储在全局(静态)存储区。

3

1
`int` `a = ``248``, b = ``4``;``int` `const` `c = ``21``;``const` `int` `*d = &a; ``int` `*``const` `e = &b;``int` `const` `* ``const` `f = &a; `

请问下列表达式哪些会被编译器禁止?

  • *c=32
    
    1
    2
    3

    - ```
    *d=43
  • e=&a
    
    1
    2
    3

    - ```
    f=0x321f
  • ```
    d=&b

    1
    2
    3

    - ```
    *e=34

4

假设函数原型和变量说明如下:

1
2
3
void f3(int(*p)[4]);
int a[4]={1234},
int b[3][4]={{1234},{5678},{9101112}};

下面调用非法的是(b)
f3(&a);
f3(b[1]);
f3(&b[1]);
f3(b);

void f3(int(*p)[4]); 其参数是数组指针 ,指向数组p的指针。

  • ​ 选项A:f3(&a); 参数为一个地址,符合指针定义。
  • ​ 选项B:f3(b[1]); 参数为一个数组的具体元素,不符合指针定义。所以B是非法的调用。
  • ​ 选项C:f3(&b[1]); 参数为一个数组元素的地址,符合指针定义。
  • ​ 选项D:f3(b); 参数为数组名,表示该数组的首地址,符合指针定义。