C语言的赋值运算和逗号表达式运算

一道C语言的题目
表达式 a=((b=1),(c=6));
它的最后结果是a为6吗?
把1赋值给b,把6赋值给c,最后逗号表达式取得是c的值,赋值给了a

是的结果是6

根据在线平台+逗号运算符的特性,只取括号最右边的那个数字

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7682627
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:类C语言-线性表习题:将有头结点的单链表A分解为两个具有相同结构的链表B、C,B表的结点为A表中值小于零的结点,C表的结点为A表中值大于零的结点(A元素为非零整数,要求B、C表利用A表的结点)。
  • 除此之外, 这篇博客: 谭浩强C程序设计第四版答案中的 4.3 写出下面各逻辑表达式的值。设a=3,b=4,c=5. 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    (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表示。
    剩下几个一样的逻辑,自己分析。

  • 以下回答来自chatgpt:

    问题回答:

    1. 这段C语言代码中的赋值运算和逗号表达式运算有什么区别?具体来说,这段表达式 a=((b=1),(c=6));最后的结果是a为6吗?请给出原因。

    答:这段代码中的逗号表达式后面跟着一个赋值操作。逗号操作符号具有求值过程的操作,并在求值过程中左边的表达式先被求值,然后再求右侧表达式的值并将这个值作为整个逗号表达式的结果。而赋值操作会将等号右侧的内容赋值给等号左侧的变量。因此,这段表达式相当于先将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

    1. 请结合参考资料中的代码,设计一个程序,输入三个整数a,b,c,输出其中的最大值。

    答:

    #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;
    }
    
    1. 请结合参考资料中的代码,设计一个程序,找到三个单链表A、B、C的交集,并将交集从A中删除。

    答:

    #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;
    }
    

    以上是三道题目的解答,希望能对你有所帮助。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^