1.以下叙述中正确的是()
A 程序必须包含所有三种基本结构才能成为一种算法
B 我们所写的每条C语句,经过编译最终都将转换成二进制的机器指令
C 如果算法非常复杂,则需要使用三种基本结构之外的语句结构,才能准确表达
D 只有简单算法才能在有限的操作步骤之后结束
解析:
正确的叙述是:
A. 错误。算法不一定需要包含所有三种基本结构(顺序、选择、循环)才能成为一种算法。算法可以只使用其中一种或两种结构。
B. 正确。C语言编写的源代码经过编译器编译后,最终会转换成二进制的机器指令,这些指令可以被计算机硬件直接执行。
C. 错误。算法的复杂性与是否需要使用三种基本结构之外的语句结构没有必然联系。即使是非常复杂的算法,也可以使用顺序、选择、循环这三种基本结构来表达。
D. 错误。算法的简单性与是否能在有限的操作步骤之后结束没有必然联系。即使是复杂算法,只要设计得当,也能在有限的操作步骤之后结束。相反,一些看似简单的算法(如无限循环),也可能无法在有限的操作步骤之后结束。
2.a->b的等效写法是()
A (*a).b
B a.(*b)
C a.b
D 都不是
解析:
这题考察的是C语言中结构体指针访问成员的问题。
现在来分析每个选项:
A. (*a).b
这是正确的写法。*a
是对指针a
进行解引用,得到它所指向的结构体。然后.b
是访问该结构体的成员b
。所以(*a).b
是有效的,并且与a->b
等效。
B. a.(*b)
这是错误的写法。在C语言中,->
运算符是专门用于结构体指针来访问其成员的。.(*b)
这种写法在C语言中是不合法的。
C. a.b
这也是错误的写法。a.b
用于直接访问结构体的成员,但在这里a
是一个指针,不是结构体本身。所以我们应该使用*a
来得到结构体,然后再访问成员b
,或者使用a->b
这种简化写法。
D. 都不是
由于A选项是正确的,所以这个选项自然就是错误的。
3.C 语言中,假设变量说明为:int k=1; 则语句运算完后,k的值是?
k--|| k, k++;
解析:
这题考察的是C语言操作符,它们的优先级和结合性会影响表达式的求值顺序。
--
和 ++
是后缀递减和递增操作符。当它们作为后缀使用时,表达式的值是在变量改变之前的值。
||
是逻辑或操作符,它会在其左侧表达式为真时立即返回真,而不计算右侧表达式(这称为短路求值)。
,
是逗号操作符,它会顺序地计算其左右两侧的表达式,并丢弃左侧表达式的值,整个表达式的值是右侧表达式的值。
现在,让我们分析表达式 k--||k, k++
:
初始时,k
的值是 1。
表达式 k--||k
被计算。首先计算 k--
,这是一个后缀递减操作,所以它会返回 k
递减之前的值(即 1),然后将 k
减 1。此时,k
变成了 0,但表达式 k--
的结果是 1(递减之前的值)。
接下来计算逻辑或 ||
。由于 k--
的结果是 1(真),逻辑或操作符会短路,即不再计算其右侧的表达式(这里的右侧表达式是 k
,但此时不会被计算)。
逗号操作符 ,
然后被计算。它顺序地计算其左右两侧的表达式,但只返回右侧表达式的值。在这里,左侧表达式 k--||k
已经计算完毕,其值为 1(但这个值被丢弃了),然后计算右侧表达式 k++
。
计算 k++
,这是一个后缀递增操作。它会返回 k
递增之前的值(即 0),然后将 k
加 1。所以,k++
的结果是 0,并且这个值是整个表达式 k--||k, k++
的结果。
最终,k
的值被递增到了 1(但由于逗号操作符的特性,这个递增后的值不会被用作表达式的最终结果)。
综上所述,表达式 k--||k, k++
计算完毕后,整个表达式的值是 0(这是由逗号操作符右侧的 k++
表达式决定的),而变量 k
的最终值是 1(因为它在表达式中被递减然后又递增了)。所以,问题是询问 k
的值,答案是 1。
4.有如下一段程序:以下语句合法的是()
int f1(float);
int f2(char);
void f3(float);
int (*pf)(float);
A int (*p)(float)=&f1;
B pf=&f2;
C pf=&f3;
D pf=f3;
解析:
这是一道关于C语言中函数指针的问题。首先,我们需要理解函数指针的声明和赋值规则。
int f1(float);
声明了一个接受float
类型参数并返回int
类型结果的函数f1
。
int f2(char);
声明了一个接受char
类型参数并返回int
类型结果的函数f2
。
void f3(float);
声明了一个接受float
类型参数但不返回任何结果的函数f3
。
int (*pf)(float);
声明了一个函数指针pf
,它可以指向一个接受float
类型参数并返回int
类型结果的函数。
接下来,我们逐一分析选项:
A. int (*p)(float)=&f1;
这是正确的。这里声明了一个函数指针p
,它指向一个接受float
类型参数并返回int
类型结果的函数,然后将f1
的地址赋给了p
。这与pf
的声明和赋值是兼容的。
B. pf=&f2;
这是错误的。f2
是一个接受char
类型参数的函数,而pf
是一个指向接受float
类型参数的函数的指针。类型不匹配,因此不能赋值。
C. pf=&f3;
这也是错误的。f3
是一个不返回任何结果的函数(返回类型为void
),而pf
是一个指向返回int
类型结果的函数的指针。同样,类型不匹配,因此不能赋值。
D. pf=f3;
这同样是错误的。这里尝试将函数f3
的地址直接赋给函数指针pf
,但由于f3
的返回类型与pf
所指向的函数返回类型不匹配(void
vs int
),因此这是不合法的。
综上所述,只有选项A是合法的语句。它正确地声明了一个与f1
兼容的函数指针,并将f1
的地址赋给了该函数指针。所以正确答案是A。
未完待续,持续更新!以防后边找不到可以点赞收藏下!