c/c++语言错题记录
c语言错题记录
判断题:设变量
n
的类型为int
,当n
的值为-10时,条件表达式((n>0) ? 2.9 : 1 )
的值为整数1。 (×)给定条件表达式:
1
(n > 0) ? 2.9 : 1
我们来看一下这两个分支表达式的类型:
2.9
是一个double
类型的浮点数。1
是一个int
类型的整数。
根据 C 和 C++ 的类型提升规则,当条件表达式的两个分支表达式类型不同时,结果的类型将是能够容纳这两个类型的最小公共类型。在这种情况下,
int
和double
的最小公共类型是double
。因此,整个条件表达式的结果类型是
double
,而不是int
。当
n = -10
时,条件n > 0
为假,所以条件表达式的结果是1
,但这个1
是double
类型的1.0
,而不是int
类型的1
。所以,条件表达式
((n > 0) ? 2.9 : 1)
的值是1.0
(double
类型),而不是整数1
(int
类型)。因此,原文中说条件表达式的值为整数1
是错误的。判断题:printf函数输出数据时会根据格式控制符自动进行数据类型转换。(×)
printf
函数不会自动进行数据类型转换。它依赖于格式控制符来正确地解释传入的参数类型。如果格式控制符和传入的参数类型不匹配,可能会导致未定义行为或错误输出。例如:
1
2int num = 10;
printf("%f", num); // 错误:%f 期望一个 double 类型在这个例子中,
%f
期望一个double
类型的参数,而num
是一个int
,这会导致未定义行为。程序员必须确保格式控制符与传入的参数类型匹配。判断题:在 C 程序中, 常量
10.0
是单精度浮点类型的数据。(×)
在 C 语言中,常量10.0
是双精度浮点类型的数据 (double
)。如果你想表示单精度浮点数 (float
),需要在数字后加上f
或F
,例如10.0f
。判断题: 设a=5,b=6,c=7,d=8,m=2,n=2,执行(m=a > b)&&(n=c>d)后n的值为2。(×)
&&
和||
一样会短路。判断题: 运行包含以下代码段的程序将可能进入死循环。 (√)
1
2int 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
。