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 期望一个 double 类型的参数,而 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范围后会变成负数。

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

    1
    (n > 0) ? 2.9 : 1
    • 2.9 是一个 double 类型的字面值。
    • 1 是一个 int 类型的字面值。

    在这种情况下,int 类型的 1 会被提升为 double,因为 double 能够表示 int 的所有值。结果表达式的类型是 double

    因此,((n > 0) ? 2.9 : 1) 的结果类型是 double,即使实际的值是 1,它仍然是一个 double 类型的 1.0