C语言错题之 10

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: C语言错题之 10

前言

不知不觉这个专栏都更到第十篇文章了,真快啊,继续加油。

今天给大家带来的是六道选择题,明天会出五道我最近在做题的时候遇到的有意思的编程题

话不多说,直接看今天的题。

1.

题干:

下面代码的运行结果是:

#include <stdio.h>
int main()
{
  int a, b, c;
  a = 5;
  c = ++a;
  b = ++c, c++, ++a, a++;
  b += a++ + c;
  printf("a = %d b = %d c = %d\n:", a, b, c);
  return 0;
}

答案:

a = 9 b = 23 c = 8

解析:

#include <stdio.h>
int main()
{
  int a, b, c;
  a = 5;
  c = ++a;// ++a:加给a+1,结果为6,用加完之后的结果给c赋值,因此:a = 6  c = 6
  b = ++c, c++, ++a, a++;
   // 逗号表达式的优先级,最低,这里先算b=++c, b得到的是++c后的结果,b是7
   // b=++c 和后边的构成逗号表达式,依次从左向右计算的。
   // 表达式结束时,c++和,++a,a++会给a+2,给c加1,此时c:8,a:8,b:7
  b += a++ + c; // a先和c加,结果为16,在加上b的值7,比的结果为23,最后给a加1,a的值为9
  printf("a = %d b = %d c = %d\n:", a, b, c); // a:9, b:23, c:8
  return 0;
}

知识点:

这道题涉及到两个知识点:

++运算符和逗号表达式

++运算符:分为前置++和后置++,

前置++:先加1,后使用,即先使用变量中内容,然后给结果加1

后置++:先使用变量中内容,整个表达式结束时,给变量加1

逗号表达式,取最后一个表达式的值

2.

题干:

下面代码的输出结果是:

#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}

A>

B<

C不输出

D程序有问题

答案:

A

解析:

C语言中,0为假,非0即为真。

全局变量,没有给初始值时,编译其会默认将其初始化为0。

i的初始值为0,i–结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8

3.

题干:

下面代码的运行结果是:

#include <stdio.h>
int main()
{
  int arr[] = {1,2,3,4,5};
  short *p = (short*)arr;
  int i = 0;
  for(i=0; i<4; i++)
  {
    *(p+i) = 0;
  }
  for(i=0; i<5; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

答案:

0 0 3 4 5

解析:

```c
arr数组在内存中的存储格式为:
0x00ECFBF4:  01 00 00 00
0x00ECFBF8:  02 00 00 00
0x00ECFBFC:  03 00 00 00
0x00ECFC00:  04 00 00 00
0x00ECFC04:  05 00 00 00
指针p的类型为short*类型的,因此p每次只能所有两个字节,for循环对数组中内容进行修改时,一次访问的是:
arr[0]的低两个字节,arr[0]的高两个字节,arr[1]的低两个字节,arr[1]的高两个字节,故改变之后,数组中内容如下:
0x00ECFBF4:  00 00 00 00
0x00ECFBF8:  00 00 00 00
0x00ECFBFC:  03 00 00 00
0x00ECFC00:  04 00 00 00
0x00ECFC04:  05 00 00 00
故最后打印:0   0   3   4   5

4.

题干:

下面代码描述正确的是:

struct student
{
  int num;
  char name[32];
  float score;
}stu;

A、stuct是结构体类型的关键字

B、struct student是用户定义的结构体类型

C、num、score都是结构体成员名

D、stu是用户定义的结构体类型名

答案:

D

解析:

stu是定义的结构体类型变量,不是名称。

如果想要让stu为结构体类型名称时,必须在结构体定义时添加 typedef关键字

5.

题干:

程序的执行结果是:

int main()
{
  unsigned char a = 200;
  unsigned char b = 100;
  unsigned char c = 0;
  c = a + b;
  printf(“%d %d”, a+b,c);
  return 0;
}

答案:

300 44

解析:

printf在传入参数的时候如果是整形会默认传入四字节,所以a+b的结果是用一个四字节的整数接收的,不会越界。而c已经在c = a + b这一步中丢弃了最高位的1,所以只能是300-256得到的44了。

补充说明

由于printf是可变参数的函数,所以后面参数的类型是未知的,所以无论传入的是什么类型,printf只会根据类型的不同将用两种不同的长度存储。其中8字节的只有long long、float和double(注意float会处理成double再传入),其他类型都是4字节。所以虽然a + b的类型是char,实际接收时还是用一个四字节整数接收的。另外,读取时,%lld、%llx等整型方式和%f、%lf等浮点型方式读8字节,其他读4字节。

6.

题干:

unsigned int a= 0x1234;
unsigned char b = *(unsigned char *)&a;

在32位大端模式处理器上变量b等于( )

答案:

0x00

解析:

大端序中,低地址到高地址的四字节十六进制排列分别为00 00 12 34,其中第一个字节的内容为00

结语

今天的六道题到这里就结束了,我们下次见。


相关文章
|
6月前
|
C语言
【C语言】错题本(3)
【C语言】错题本(3)
34 0
|
6月前
|
C语言
【C语言】错题本(2)
【C语言】错题本(2)
34 0
|
6月前
|
C语言
【C语言】错题本(1)
【C语言】错题本(1)
52 0
|
6月前
|
存储 C语言
【C语言】错题本(4)
【C语言】错题本(4)
36 0
|
存储 C语言
C语言错题之 8
C语言错题之 8
67 0
|
C语言
C语言错题之 5
C语言错题之 5
51 0
|
6月前
|
C语言
C语言:初阶测试错题(查漏补缺)
C语言:初阶测试错题(查漏补缺)
40 0
|
C语言
C语言分支语句和循环语句经典题及易错题
C语言分支语句和循环语句经典题及易错题
159 0
|
存储 编译器 开发工具
C语言错题之 7
C语言错题之 7
71 0
|
C语言
C语言错题之 6
C语言错题之 6
55 0