文章目录

  • ​​1宏定义 #define PI 3.14159 中,用宏名PI代替一个​​
  • ​​2.字符串"\x54BNHGb13,2m"的长度为​​
  • ​​3,程序输出​​
  • ​​4,字符串的错误赋值​​
  • ​​5.浮点数参与运算问题​​
  • ​​6.指针指向数组元素​​
  • ​​7,错误语句​​
  • ​​8,+=,-=联系运算` n += n -= n * n`​​
  • ​​9,++ -- 运算符​​
  • ​​10,计算精度和运算转换`1.0/3*3不等于1`​​
  • ​​11, 函数返回整形和字符型可以不写类型 不过有警告​​
  • ​​12.类型转换​​
  • ​​13,两个char类型的数据相加结果是int类型[link](javascript:void(0))​​
  • ​​14,a = int (b + 3);错误表达式 int应该被()扩住​​
  • ​​15,C语言是一门对标识符大小写敏感的程序设计语言 🙆‍♂️​​
  • ​​16 ,C语言源程序经过编译、链接后生成的可执行文件扩展名是 .exe​​
  • ​​17, c语言中的源程序必须经过编译连接生成可执行程序才能运行 有争议,答案写错有的写对​​
  • ​​18, 用C语言编写的代码程序 `是一个源程序`​​
  • ​​19, 格式字符 `%md` m可以是负号​​
  • ​​20,c语言中,任意两个函数间不能嵌套定义,但可以互相调用(❌)​​
  • ​​21,函数返回值的数据类型取决于return语句中表达式的数据类型 (❌)​​
  • ​​22,c中,函数的行参是指针类型时,调用时对应的实参也必须是地址量​​
  • ​​23, c中,函数的行参是指针类型时,调用时对应的实参也必须是指针类型​​
  • ​​24, 对任意变量,一旦定义为某一确定类型后,该变量在程序运行时所占的存储空间的多少和所能参加的运算类型便已经确定了​​
  • ​​35, 若某自定义函数中没有return语句,则该函数一定没有返回值 (❌)​​
  • ​​26, 在C语言中,变量的初始化都是在编译阶段完成的 (❌)​​
  • ​​27,在函数定义中,行参变量有时也以是全局变量 (❌)​​
  • ​​28,宏定义不是c语句,不必在行末加分号 🙆‍♂️​​
  • ​​29,语句`for(; ;){...}`和`while(1){...}`是等价的 🙆‍♂️ 都是死循环​​
  • ​​30,c语言编译系统对宏命令的处理是在对源程序中其他成分正式编译之前进行的 🙆‍♂️​​
  • ​​31,函数调用可以是函数的行参 (❌)​​
  • ​​32,在同一源文件中,全局变量与局部变量同名,在局部变量作用范围内,全局变量的值等于局部变量的值 (❌)​​
  • ​​33, c语言中任何一个表达式的最后加上一个分号就构成了一个合法的语句​​
  • ​​34 下列描述中不正确的是_______。记住即可​​
  • ​​35.指针易错题​​
  • ​​36.若程序中有宏定义行:#define N 100 则以下叙述中正确的是__B__。​​
  • ​​37以下程序的输出结果是_D__。​​
  • ​​38以下叙述正确的是__B__。`可以把define定义为用户标识符`​​
  • ​​39 typedef struct node{int data; struct node *next; } *NODE; NODE p;​​
  • ​​40 FILE fprintf fscanf 文件读取问题​​
1宏定义 #define PI 3.14159 中,用宏名PI代替一个

字符串
​​​参考​​​ 答案是字符串,但还是有争议的​​c语言中宏名是什么类型?​

2.字符串"\x54BNHGb13,2m"的长度为

​11​​​ ​​参考​​​ 将 ​​\054​​当作一个十六进制字符,后面的十位字符 得11
存在问题,不实际,真正运行的时候会报16进制格式错误而终止
​查看问题​

3,程序输出

int a = 1; switch (a) { case 1: printf("1"); case 2: printf("2"); break; default: printf("other"); }

​12​​​ 如果没有​​break​​还会打印other
在js中也是,下面的2也会执行,真是奇怪

4,字符串的错误赋值

🙅‍♂️

char str[10]; 
str = "123"

​​字符串赋值 不允许先定义后直接赋值​​ 数组名字就是一个指针(重点)
指针指向字符串第一个元素
所以str = "123"相当于让指针指向一个字符串常量,指针指向的需要是地址
要后赋值的话可以用strcpy赋值

char str[10];
strcpy(str, "123");
printf("%s \n", str);
5.浮点数参与运算问题

如果有浮点数参与运算都转化成double类型计算,否则 3/2 = 1 而 3.0/2=1.5 或者 3 / 2.0 = 1.5​参考​

double x, y;
x = 1;
y = x + 3 / 2;// 1 + 1
printf("%lf", y); //=> 2
6.指针指向数组元素

指针指向a[3]的位置指向数据4,p++就会向下位移一位

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *p = &a[3];
int b = p[5]; // 9
printf("%d \n", b); //9
printf("%d \n", *(p++)); //4
printf("%d \n", *(p++)); //5
printf("%d \n", *(p++)); //6
printf("%d \n", *(p++)); //7
printf("%d \n", *(p++)); //8
printf("%d \n", *(p++)); //9
printf("%d \n", *(p++)); //10
printf("%d \n", *p); //开始随机数
7,错误语句
char a, b, c, *d;   
// a='\'; //错误 单写一个\会转意后面的所有
b = '\xbc'; // 无法标识 但是合法,不报错
// c='\0xab'; //错误 不合法
d = "\017"; // 无法标识 但是合法,不报错
char f = '\xab'; // 无法标识 但是合法,不报错
char g = '\xbl'; // 有警告 但是合法 打印 l
printf("%c | %c \n", b, *d);
8,+=,-=联系运算​​n += n -= n * n​
int n = 3;
// n += n -= n * n;
//相当于下面两部
n -= n * n;//n -> -6
n += n; // -6 + -6
printf("%d\n", n);//=> -12
9,++ – 运算符

int x = 3, y = 2; int z = (y++ == --x) ? y++ : x; printf("%d \n", z);// 3

因为 z = y++;是后加所以赋值给z的是y的值,还未++,所以是3

10,计算精度和运算转换​​1.0/3*3不等于1​

1.0/3*3不等于1​​解答​

11, 函数返回整形和字符型可以不写类型 不过有警告
backInt()
{
return 0;
}

backChar()
{
return 'a';
}

int main()
{
printf("%d \t %c \n", backInt(), backChar());
return 0;
}

c语言 错题集_数据类型

12.类型转换

​link​当一个C语言表达式中同时含有字符型、整型、单精度和双精度类型数据参加运算时,按照"由低到高"的原则,所有的数据都必须先转换为双精度类型数据后方能参加运算。( )答案为×
自动转换遵循以下规则:

  1. 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
  2. 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。
    a.若两种类型的字节数不同,转换成字节数高的类型
    b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
  3. 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
  4. char型和short型参与运算时,必须先转换成int型。
  5. 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。
    隐式转换
    隐式类型转换分三种,即算术转换、赋值转换和输出转换。
    1.算术转换
    进行算术运算(加、减、乘、除、取余以及符号运算)时,不同类型数招必须转换成同一类型的数据才能运算,算术转换原则为:
    在进行运算时,以表达式中最长类型为主,将其他类型位据均转换成该类型,如:
    (1)若运算数中有double型或float型,则其他类型数据均转换成double类型进行运算。
    (2)若运算数中最长的类型为long型.则其他类型数均转换成long型数。
    (3)若运算数中最长类型为int型,则char型也转换成int型进行运算。算术转换是在运算过程中自动完成的。
    2.赋值转换
    进行赋值操作时,赋值运算符右边的数据类型必须转换成赋值号左边的类型,若右边的数据类型的长度大于左边,则要进行截断或舍入操作。
    下面用一实例说明:
    char ch;
    int i,result;
    float f;
    double d;
    result=ch/i+(fd-i);
    (1)首先计算 ch/i,ch → int型,ch/i → int型。
    (2)接着计算 f
    d-i,由于最长型为double型,故f→double型,i→double型,fd-i→double型。
    (3)(ch/i) 和(f
    d-i)进行加运算,由于fd-i为double型,故ch/i→double型,ch/i+(fd-i)→double型。
    (4)由于result为int型,故ch/i+(f*d-i)→double→int,即进行截断与舍入,最后取值为整型。
    3.输出转换
    在程序中将数据用printf函数以指定格式输出时,当要输出的盐据类型与输出格式不符时,便自动进行类型转换,如一个long型数据用整型格式(%d)输出时,则相当于将long型转换成整型(int)数据输出;一个字符(char)型数据用整型格式输出时,相当于将char型转换成int型输出。
    注意:较长型数据转换成短型数据输出时,其值不能超出短型数据允许的值范围,否则转换时将出错。如:
    long a=80000;
    printf("%d",a);
    运行结果为14464,因为int型允许的最大值为32767,80000超出此值,故结果取以32768为模的余数,即进行如下取余运算:
    (80000-32768)-32768=14464;
    输出的数据类型与输出格式不符时常常发生错误,如:
    int d=9;
    printf("%f",d);

    float c=3.2;
    printf("%d",c);
    将产生错误的结果。
    同一句语句或表达式如果使用了多种类型的变量和常量(类型混用),C 会自动把它们转换成同一种类型。以下是自动类型转换的基本规则:
  1. 在表达式中,char 和 short 类型的值,无论有符号还是无符号,都会自动转换成 int 或者 unsigned int(如果 short 的大小和 int 一样,unsigned short 的表示范围就大于 int,在这种情况下,unsigned short 被转换成 unsigned int)。因为它们被转换成表示范围更大的类型,故而把这种转换称为“升级(promotion)”。
  2. 按照从高到低的顺序给各种数据类型分等级,依次为:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。这里有一个小小的例外,如果 long 和 int 大小相同,则 unsigned int 的等级应位于 long 之上。char 和 short 并没有出现于这个等级列表,是因为它们应该已经被升级成了 int 或者 unsigned int。
  3. 在任何涉及两种数据类型的操作中,它们之间等级较低的类型会被转换成等级较高的类型。
  4. 在赋值语句中,= 右边的值在赋予 = 左边的变量之前,首先要将右边的值的数据类型转换成左边变量的类型。也就是说,左边变量是什么数据类型,右边的值就要转换成什么数据类型的值。这个过程可能导致右边的值的类型升级,也可能导致其类型降级(demotion)。所谓“降级”,是指等级较高的类型被转换成等级较低的类型。
  5. 作为参数传递给函数时,char 和 short 会被转换成 int,float 会被转换成 double。使用函数原型可以避免这种自动升级。
13,两个char类型的数据相加结果是int类型​​link​​
14,a = int (b + 3);错误表达式 int应该被()扩住
15,C语言是一门对标识符大小写敏感的程序设计语言 🙆‍♂️
16 ,C语言源程序经过编译、链接后生成的可执行文件扩展名是 .exe
17, c语言中的源程序必须经过编译连接生成可执行程序才能运行 有争议,答案写错有的写对

​link​

18, 用C语言编写的代码程序 ​​是一个源程序​

答案解析
[解析] C语言是一种高级语言,用C语言编写的代码程序经过编译程序编译之后,生成一个后缀为OBJ的二进制文件(称为目标文件),随后还要由“连接程序”软件,把该OBJ文件与C语言提供的各种库函数连接在一起,生成一个以EXE为后缀的可执行文件,才可以执行,因此C语言不能立即执行。故选项A、C和D错误。用C语言编写的代码程序是一个源程序,选项B正确。

19, 格式字符 ​​%md​​ m可以是负号

​link​​​ 允许,虽然我没卡出来有什么不同
printf("%-3d \n", 10);

20,c语言中,任意两个函数间不能嵌套定义,但可以互相调用(❌)

main 函数也属于函数,不能在main函数内定义函数

21,函数返回值的数据类型取决于return语句中表达式的数据类型 (❌)

​link​在定义函数时所指定的数据类型
在C语言中,函数返回的数据类型取决于
A.函数名字 B.return语句中表达式的数据类型 C.在定义函数时所指定的数据类型   D.主调函数的数据类型
优质解答
选择C,函数返回值的类型和函数名是没有关系的,函数名只是个简单的代号,没有什么特殊的意义,return 语句中表达式的数据类型必须和 定义函数是所指定的数据类型一样才可以,否则会出错。至于主调函数,强调一下。 主调函数一般都是void 也就是空型的,没有什么特殊用处,也只是为了保持函数格式的一致。

22,c中,函数的行参是指针类型时,调用时对应的实参也必须是地址量
23, c中,函数的行参是指针类型时,调用时对应的实参也必须是指针类型
24, 对任意变量,一旦定义为某一确定类型后,该变量在程序运行时所占的存储空间的多少和所能参加的运算类型便已经确定了
35, 若某自定义函数中没有return语句,则该函数一定没有返回值 (❌)

​link​​​ A)没有返回值 B)返回若干个系统默认值C)返回一个用户所希望的函数值 D)返回一个不确定的值
答案是D ,即使函数中没有return语句,若函数不声明为void型,调用函数的时候还是可以得到int型的返回值。但是一个不确定的值,所以应该选D。
return 表示把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定。 return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。
如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。

26, 在C语言中,变量的初始化都是在编译阶段完成的 (❌)

不明白 但答案是错 待解决​​link​

27,在函数定义中,行参变量有时也以是全局变量 (❌)

理解为局部变量

28,宏定义不是c语句,不必在行末加分号 🙆‍♂️
29,语句​​for(; ;){...}​​​和​​while(1){...}​​是等价的 🙆‍♂️ 都是死循环
30,c语言编译系统对宏命令的处理是在对源程序中其他成分正式编译之前进行的 🙆‍♂️
31,函数调用可以是函数的行参 (❌)
32,在同一源文件中,全局变量与局部变量同名,在局部变量作用范围内,全局变量的值等于局部变量的值 (❌)

应该是全局变量的值应该不存在等于什么局部变量,只是局部变量有效

33, c语言中任何一个表达式的最后加上一个分号就构成了一个合法的语句
34 下列描述中不正确的是_______。记住即可

A.字符型数组中可以存放字符串
B.可以对字符型数组进行整体输入、输出
C.可以对整型数组进行整体输入、输出
D.不能在赋值语句中通过赋值运算符“=”对字符型数组进行整体赋值
正确答案
C
答案解析
[评析] C语言规定只能逐个引用数组元素而不合下次引用整个数组。字符数组的输入、输出可以将整个字符串一次输入或输出。所以,选项C的说法是不正确的。

35.指针易错题

point(char *p){p+=3;} main() { char b[4]={'a','b','c','d'},*p=b; point(p); printf("%c\n",*p); }

程序运行后的输出结果是__A___。
A.a B.b C.c D.d
函数内对指针的操作不影响外面的指针 除非指针指向地址的值发生变化

36.若程序中有宏定义行:#define N 100 则以下叙述中正确的是__B__。

A.宏定义行中定义了标识符N的值为整数100
B.在编译程序对C源程序进行预处理时用100替换标识符N
C.对C源程序进行编译时用100替换标识符N
D.在运行时用100替换标识符N

37以下程序的输出结果是_D__。

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

A.a=%2,b=%5 B.a=2,b=5 C.a=%%d,b=%%d D.a=%d,b=%d
两个 ​​​%%​​​输出一个字符 ​​'%'​​ 后面的`d``则没了转义作用就成了普通字符d

38以下叙述正确的是__B__。​​可以把define定义为用户标识符​

A.可以把define和if定义为用户标识符
B.可以把define定义为用户标识符,但不能把if定义为用户标识符
C.可以把if定义为用户标识符,但不能把define定义为用户标识符
D.define和if都不能定义为用户标识符

39 typedef struct node{int data; struct node *next; } *NODE; NODE p;

以下叙述中正确的是__A__。
A.p是指向struct node结构变量的指针的指针 B.NODE p;语句出错
C.p是指向struct node结构变量的指针 D.p是struct node结构变量

40 FILE fprintf fscanf 文件读取问题
main()
{
FILE *fp;
int i=20,j=30,k,n;
fp=fopen("d1.dat","w");
fprintf(fp,"%d\n",i);
fprintf(fp,"%d\n",j);
fclose(fp);
fp=fopen("d1.dat","r");
fscanf(fp,"%d%d",&k,&n);
printf("%d%d\n",k,n);
fclose(fp);
}

结果 2030