一道C语言的题目
表达式 a=((b=1),(c=6));
它的最后结果是a为6吗?
把1赋值给b,把6赋值给c,最后逗号表达式取得是c的值,赋值给了a
是的结果是6
根据在线平台+逗号运算符的特性,只取括号最右边的那个数字
(1) a+b>c&&b==c
结果为0. 因为a+b=7>c=5,所以&&左边是真,用1表示。右边b==c用0表示。所以1&&0结果为0
(2)a||b+c&&b-c
结果为1。第93页的优先级别,算术运算符高于关系运算符,所以上面左边变成3||9为真,用1表示。右边为-1,故为1&&-1,都不是0,故为真,用1表示。
剩下几个一样的逻辑,自己分析。
问题回答:
答:这段代码中的逗号表达式后面跟着一个赋值操作。逗号操作符号具有求值过程的操作,并在求值过程中左边的表达式先被求值,然后再求右侧表达式的值并将这个值作为整个逗号表达式的结果。而赋值操作会将等号右侧的内容赋值给等号左侧的变量。因此,这段表达式相当于先将b赋值为1,再将c赋值为6,最后将6赋值给了a,因此最后的结果是a为6。具体过程如下:
b=1 // b被赋值为1 c=6 // c被赋值为6 a=(b,c) // 逗号运算符优先级较低,所以先算b,c,逗号运算返回c的值6,再将6赋值给a,即a=6
答:
#include<stdio.h>
int max(int x, int y) { // 定义函数max,用于比较两个数的大小,返回最大值
if (x > y) {
return x;
}
else {
return y;
}
}
int main() {
int a, b, c;
int max_temp;
printf("请输入三个整数并以空格隔开:\n");
scanf("%d%d%d", &a, &b, &c);
max_temp = max(a, b); // 先比较a和b
printf("最大值为:%d\n", max(max_temp, c)); // 再比较上面的结果和c
return 0;
}
答:
#include<stdlib.h>
#include<stdio.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct LNode { // 定义单链表节点结构体
ElemType data;
LNode* next;
}LNode, * LinkList;
Status InitList(LinkList& L) { // 初始化单链表 L
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
return OK;
}//InitList
Status CreateList(LinkList& L, int e) { // 创建单链表
LinkList p = L;
while (p->next)
p = p->next;
LinkList temp = (LinkList)malloc(sizeof(LNode));
temp->data = e;
temp->next = NULL;
p->next = temp;
return OK;
}//CreateList
Status DispList(LinkList& L) { // 打印单链表 L
LinkList p = L;
p = p->next;
while (p)
{
printf("%d\t", p->data);
p = p->next;
}
return OK;
}//DispList
Status ListMinus(LinkList& A, LinkList& B, LinkList& C) { // 求交集
LinkList pa, qa, pb, pc, temp;
// pa 指向 A 中当前需要比较的节点,qb 指向 A 中当前节点的前一个节点,方便删除
pa = A; qa = pa; pa = pa->next;
pb = B->next; // pb 和 pc 分别指向 B 和 C 的首元结点
pc = C->next;
while (pa && pb && pc) { // 如果有一个链表遍历完毕,就跳出循环,这样可以减少运行时间
if (pa->data == pb->data && pb->data == pc->data) { // 删除条件
temp = pa;
pa = pa->next;
qa->next = qa->next->next; // 可以写成 qa->next = pa;
pb = pb->next;
pc = pc->next;
free(temp); // 删除节点,释放内存
}
else if (pb->data < pc->data) { // 如果 pb 小于 pc 就将 pb 和 pa、qa 后移
pa = pa->next; // 因为 pa->data != pb->data
qa = qa->next;
pb = pb->next;
}
else if (pb->data > pc->data) { // 如果 pb 小于 pc 反之后移 pc 和 pa 、qa
pa = pa->next;
qa = qa->next;
pc = pc->next;
}
else if (pa->data < pb->data) { // 如果 pa 小于 pb 就将 pa、qa 后移
pa = pa->next;
qa = qa->next;
}
else if (pa->data == pa->next->data) { // 如果 A 中有重复元素
pa = pa->next;
qa = qa->next;
}
}
return OK;
}//ListMinus
int main() {
LinkList A, B, C;
// 初始化
InitList(A); InitList(B); InitList(C);
// 创建
printf("\n表 A 为:\n");
for (int i = 1; i < 6; i++)
CreateList(A, i);
DispList(A);
printf("\n表 B 为:\n");
for (int j = 2; j < 7; j++)
CreateList(B, j);
DispList(B);
printf("\n表 C 为:\n");
for (int k = 3; k < 9; k++)
CreateList(C, k);
DispList(C);
// 取交集并删除
ListMinus(A, B, C);
printf("\n表 A 为:\n");
DispList(A);
return OK;
}
以上是三道题目的解答,希望能对你有所帮助。