c语言错题记录

  • 判断题:设变量n的类型为int,当n的值为-10时,条件表达式 ((n>0) ? 2.9 : 1 )的值为整数1。 (×)

    给定条件表达式:

    1
    (n > 0) ? 2.9 : 1

    我们来看一下这两个分支表达式的类型:

    • 2.9 是一个 double 类型的浮点数。
    • 1 是一个 int 类型的整数。

    根据 C 和 C++ 的类型提升规则,当条件表达式的两个分支表达式类型不同时,结果的类型将是能够容纳这两个类型的最小公共类型。在这种情况下,intdouble 的最小公共类型是 double

    因此,整个条件表达式的结果类型是 double,而不是 int

    n = -10 时,条件 n > 0 为假,所以条件表达式的结果是 1,但这个 1double 类型的 1.0,而不是 int 类型的 1

    所以,条件表达式 ((n > 0) ? 2.9 : 1) 的值是 1.0double 类型),而不是整数 1int 类型)。因此,原文中说条件表达式的值为整数 1 是错误的。

  • 判断题:printf函数输出数据时会根据格式控制符自动进行数据类型转换。(×)

    printf 函数不会自动进行数据类型转换。它依赖于格式控制符来正确地解释传入的参数类型。如果格式控制符和传入的参数类型不匹配,可能会导致未定义行为或错误输出。

    例如:

    1
    2
    int num = 10;
    printf("%f", num); // 错误:%f 期望一个 double 类型

    在这个例子中,%f 期望一个 float 类型的参数,而 num 是一个 int,这会导致未定义行为。程序员必须确保格式控制符与传入的参数类型匹配。

  • 判断题:在 C 程序中, 常量10.0是单精度浮点类型的数据。(×)
    在 C 语言中,常量 10.0 是双精度浮点类型的数据 (double)。如果你想表示单精度浮点数 (float),需要在数字后加上 fF,例如 10.0f

  • 判断题: 设a=5,b=6,c=7,d=8,m=2,n=2,执行(m=a > b)&&(n=c>d)后n的值为2。(√)

    &&|| 一样会短路。

  • 判断题: 运行包含以下代码段的程序将可能进入死循环。 (×)

    1
    2
    int i = 1
    while(i>0){ i++; printf("%d ",i); }

    因为当i超过int范围后会变成负数。

  • 选择题:

    以下不能正确定义二维数组的选项是(D)

    A.int a[2][2]={{1},{2}};

    B.int a[][2]={1,2,3,4};

    C.int a[2][2]={{1},2,3};` D.`int a[2][]={{1,2},{3,4}};

    解析:在定义数组时,需要指定每一维度的大小,除了最外层维度。选项 D 中第二个维度的大小未指定,因此是错误的。

  • 判断题:一次只能引用单个的数组元素,而不能一次引用整个数组。(√)

  • 根据声明int (*p)[10], p是一个(B)。

    A.数组

    B.指针

    C.函数

    D.数组的元素

    解析:根据声明int (*p)[10]p 是一个指向包含 10 个整数的数组的指针。

  • 知识点:指针是一个变量

  • 知识点:在C程序中,函数可以嵌套调用,但不可以嵌套定义。

  • 选择题:
    以下说法正确的是(D)

    A.一个C语言源文件(.c文件)必须包含main函数

    B.一个C语言源文件(.c文件)可以包含两个以上main函数

    C.C语言头文件(.h文件)和源文件(.c文件)都可以进行编译

    D.在一个可以正确执行的C语言程序中,一个C语言函数的声明(原型)可以出现任意多次
    解析:
    A:一个 C 语言源文件(.c 文件)不一定必须包含 main 函数。

    • main 函数是程序的入口点,但它只需要出现在整个程序中一次。

    • 一个项目可以由多个 .c 文件组成,其中只有一个 .c 文件需要定义 main 函数,其余文件可以定义其他函数、变量等。

    C:.h文件不能单独进行编译。

    D:在一个可以正确执行的C语言程序中,一个C语言函数的声明(原型)可以出现任意多次正确

  • 选择题:

    已知函数定义如下

    1
    2
    3
    4
    int max(int a,int b)
    {
    return a>b?a:b;
    }

    下面函数声明不正确的是(C)

    A.int max(int a,int b);

    B.int max(int x,int y);

    C.max(int a,b);

    D.int max(int,int );
    解析:
    B参数名 xy 与定义中的 ab 不同,但这不影响函数声明的正确性。函数声明只需要保证参数的类型和顺序与定义一致,参数名可以不同。
    C这是不正确的,因为函数声明中必须明确指定返回值类型。这里缺少返回值类型 int

  • 选择题:

    下面说法不正确的是(C)。

    A.函数是一个完成特定工作的独立程序模块,包含自定义函数和库函数。

    B.函数定义的一般形式包含函数首部和函数体。

    C.自定义函数被调用时都要先声明,跟主函数与被调函数的位置无关。

    D.函数首部由函数类型、函数名和形式参数表组成,且首部后面不能加分号。
    解析:
    A函数是程序中的独立模块,用于完成特定任务。可以是程序员自己定义的(自定义函数),也可以是编程语言提供的(库函数)。
    C自定义函数是否需要先声明,取决于函数的定义位置:

    1. 如果函数定义在调用它的代码之前,则不需要声明。

    2. 如果函数定义在调用它的代码之后,则需要先声明(通常通过函数原型声明)。

    • 因此,函数是否需要声明与主函数和被调函数的位置相关。
  • 判断题:指针所占内存的大小由其指向的数据类型的大小决定。(×)
    解析:题干说的是指针所占的内存,这是由系统的架构(操作系统和处理器)决定的,认真审题。