程序设计基础:错题解析与C语言陷阱

需积分: 0 0 下载量 169 浏览量 更新于2024-08-04 收藏 39KB DOCX 举报
"程序设计基础--错题回顾1" 在程序设计基础的学习中,经常会遇到一些易错的问题。这里我们回顾一下几个关键知识点,主要涉及C语言。 首先,关于"i+=3, j+=7"这样的循环结构,这是一种典型的“跑圈追赶”问题。在C语言中,`unsigned short`类型可以表示2的16次方,即216个不同的数值,范围从0到216-1。如果j初始位置比i前两个位置,且i每次增加5,j每次增加7,那么j会最终追上并超过i。理解这种关系对于解决循环条件判断和循环变量变化的问题至关重要。 接着,我们来看一下运算符的优先级。在表达式7&3+12中,"&"(按位与)的优先级低于"+",因此7&3先计算,得到1,然后与12相加,得到13,而不是15。这是理解C语言中运算符优先级的一个例子,正确理解这些规则能避免计算错误。 在结构体类型方面,C语言允许我们定义包含多种不同类型成分的复合数据类型。结构体成员可以是基本数据类型,也可以是其他已定义的结构体类型。但是,结构体本身在定义时并不分配内存,只有当创建结构体变量时,编译器才会为它分配内存。例如: ```c struct Student { char name[20]; int age; }; struct Student s1; // 创建结构体变量s1,此时分配内存 ``` 在联合体(union)的使用上,联合体内的所有成员共享同一块内存空间,这意味着最后一次赋值的成员决定了整个联合体的值。如例子所示,`union birth`定义了一个包含三个`int`的联合体,它们都在同一个4字节的内存空间内。 宏定义是预处理器的一种功能,用于文本替换。在宏定义中,应注意换行和参数使用。例如,正确的宏定义应该如下: ```c #define P3 #define F(x) (P * x * x) ``` 在C语言中,用户标识符是程序员自定义的变量、函数等名称,必须遵循一定的规则。合法的用户标识符不能是关键字,如选项A的`int`,C的`if`,也不能包含运算符,如选项D的`i+j`。选项B的`sin`是一个合法的用户标识符,虽然在某些库中可能已经定义为特定的函数。 关于宏定义中的递增运算符(`++`),在`j=product(i++)`和`k=product(++i)`这两个例子中,需要理解它们的副作用。`i++`先返回当前的i值,然后i自增;而`++i`先使i自增,然后返回新的值。因此,这两个表达式分别计算的是不同的值。 最后,涉及到条件语句的执行,如`if`语句后的三元运算。在C语言中,如果条件满足,只会执行紧跟其后的单条语句。在给出的例子中,即使多条语句写在一起,实际上只会执行一条,这也是一个常见的陷阱。 通过复习这些知识点,我们可以更好地理解和解决程序设计基础中的常见错误。在实际编程中,理解这些概念并熟练应用将有助于编写出更高效、更可靠的代码。