c基础练习题
- 设有说明:char w; int x; double y; 则表达式w*x-y 值的数据类型为( )。
A. float B. char C. int D. double
答案:D
解析:在C语言中,当不同类型的数据进行算术运算时,较低类型的数据会被提升(或称为转换)到较高类型的数据。此处类型最高的是double
- 若有以下类型说明:( ) char w; int x; float y, z; 则表达式w*x+z-y的结果为____类型。
A.float B.char C.int D.double
答案:A
解析:在C语言中,当不同类型的数据进行算术运算时,较低类型的数据会被提升(或称为转换)到较高类型的数据。此处会提升为float类型。
- 假定下列 x 和 y 均为 int 型变量,则不正确的赋值为( );
A. x+=y++ B. ++x=++y
C. x=++y D. x++=y++
解析:在C/C++(以及大多数类似的语言)中,前缀递增运算符++返回递增后的值,但赋值运算符的左侧不能有递增或递减运算符的结果。
- 以下程序运行后输出的结果是______。
#include <stdio.h>
int main()
{
int k = 011;
printf("%d\n", k++);
return 0;
}
输出的结果是:9
分析:011代表的是八进制结果换算成十进制是9。
- 请正确填写输出结果。
int main()
{
int a = 15;
int b = 20;
int c;
a && b = ? (1)
a & b = ? (2)
a || b ? (3)
a | b = ? (4)
a >> 2 = ? (5)
}
(1)____1____(2)___4______(3)___1_____(4)___31_____(5)___3_____
分析:
(1)由于&&操作是逻辑与,非零为真,所有真与真结果为真就是1。
(2)由于&操作是按位与操作,15变为二进制是0000 1111而20是00010100,进行与操作结果是0000 0100。再转换成十进制为4。
(3) a || b 评估为真(因为a或b中至少有一个非零),在条件运算符中这同样被视为1。
(4) a | b 执行按位或操作,结果为31(二进制0001 1111)。
(5) a >> 2 执行位右移操作,结果为3(二进制0000 0011)。
- 为了表示“a和b都不等于0”应使用( )。(山东丁一)
A. (a!=0) || (b!=0) B. allb
C. !((a==0)&&(b==0)) D. a&&b
答案:D
分析:A:a不等于0或上b不等于0,明显不符合题目要求。
B:a或b为真,那么a或b其中一个为真就为真。
C:非上一个a等于0并且b等于0,相当于A
D:a与b为真,满足题目要求
- 设 a=3,b=4,c=4,则表达式 a+b>c&&b==c&&allb+c&&b==c 的值为( 1 )。(易购软件)
分析:观察优先级,算出最后结果为真
- 已知 a = 13, a << 2的十进制数值为 ( 52 )。(易购软件)
答案:52
分析a=13(0000 1101)<<2=(00110100)=52
- int x = 2, y = 3, z = 4; 则表达式 x + (y > !z)的值为( 3 )。(易购软件)
分析:优先级最高的是!z,非真为假,y>0为真就是1,所以结果为2+1等于3
- 能正确表示a和b同时为正或同时为负的逻辑表达式是:( ) (宇视科技,紫光云数,新华三,石峰)
A. (a >= 0 ll b >= 0) && (a < 0 ll b < 0)
B. (a>=0 && b>=0) && ( a < 0 && b < 0)
C. (a + b > 0) && (a + b <= 0)
D. a * b > 0
答案:D
分析:A. (a >= 0 ll b >= 0) && (a < 0 ll b < 0):这里的逻辑运算符应该是逻辑与(&&),而不是逻辑或(||),并且逻辑表达式应该是互斥的,即a和b要么都大于等于0,要么都小于0,而不是同时满足。
B. (a>=0 && b>=0) && ( a < 0 && b < 0):这个表达式同样使用了逻辑与(&&),意味着两个条件都必须同时为真,这是不可能的,因为a和b不能同时大于等于0和小于0。
C. (a + b > 0) && (a + b <= 0):这个表达式同样逻辑上是错误的,因为a和b的和不能同时大于0和小于等于0。
D. a * b > 0:这个表达式是正确的,因为如果a和b都是正数,它们的乘积是正数;如果a和b都是负数,它们的乘积也是正数。如果a和b一个是正数一个是负数,它们的乘积将是负数,这个表达式就不成立。
- int a=1, b=2, c=3, d=4, m=2, n=2; 执行 (m=a>b) && (n=c>d) 后,n=____0____(杭州快越科技)
答案:0
分析:c>d为假
- 语句 printf("%d \n", 12 & 012); 的输出结果是:( ) (紫光云数,新华三,石峰)
A. 12 B. 8 C. 6 D. 012
答案:B
分析:转换为二进制后进行按位与
- 有如下代码char cTwoLength = 153;那么 print("\r\n %d", cTwoLength >> 4)打印的值为 __-7______ (紫光云数)
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | ||
1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | ||
右移补1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | |
反码 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | |
原码 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
提示:char是有符号字符型,取值范围[-128 , +127],153属于最大值越界,结果是-103,然后对-103进行右移4位的计算输出。右移规则:
- 对于无符号整数,左侧补0。
- 对于有符号整数,如果原数是正数,则在左侧补0;如果原数是负数,则在左侧补1。
提示到这里,你试试计算一下吧,一定要理解清楚原理啊
- 以下所列的C语言常量中,错误的是: (华三外协,紫光云数,新华三,石峰)
- 0.1f B. 1.0e0.1
C. 'z' D. '\110'
- sizeof(float)是( )。(山东丁一)
A. 一个双精度型表法式 B. 一个整型表达式
C. 一个函数调用 D. 一个不合法的表达式
- 一个32位的机器,一个 char 代表的范围是?一个 int 代表的范围是?(广域科技)
char范围是1个字节 int范围是4个字节
- 下面的代码输出是什么,为什么? (信雅达)
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts(">6") : puts("<=6");
}
答案:>6 因为无符号数跟有符号数在一个表达式中会发生类型转换,有符号数会变成无符号数。
- 按位或运算符(|) (深圳元征信息科技) 0x10 | 0x01 = ? 十六进制的结果是多少?
0x11
- 按位与运算符(&) (深圳元征信息科技) 0x10 & 0x01 = ? 十六进制的结果是多少?
0x00
分析:进行按位与和按位或运算即可
- 关于条件的书写
判断year是不是闰年
if( )
判断num是偶数
if( )
判断num是一个三位数
if( )
判断字符ch是大写字母
if( )
判断字符ch是偶数数字字符
if( )
答案:
-
判断
year
是不是闰年:if (!(year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
这个条件检查年份是否能够被4整除且不能被100整除,或者能够被400整除,满足这些条件之一的年份是闰年。
-
判断
num
是偶数:if (num % 2 == 0)
如果
num
除以2的余数为0,则num
是偶数。 -
判断
num
是一个三位数:if (num >= 100 && num <= 999)
这个条件检查
num
是否在100到999之间,如果是,那么它是一个三位数。 -
判断字符
ch
是大写字母:if (ch >= 'A' && ch <= 'Z')
这个条件检查
ch
是否在大写字母的ASCII码范围内。 -
判断字符
ch
是偶数数字字符:if ((ch >= '0' && ch <= '9') && ((ch - '0') % 2 == 0))
这个条件首先检查
ch
是否是数字字符(0到9),然后检查该数字是否是偶数(0, 2, 4, 6, 8)。这里(ch - '0')
将字符转换为其对应的整数值。