竹逸 发表于 2022-8-9 17:53:22

我这代码这么编译不了

#include<stdio.h>

void main()
{
        int a = 1, b = 5, c = 8;
        int y = (a+b), (b+c);
        printf("%d\n", y);
}

可当我把上面的代码改成下面的就可以,为啥下面的行,它们有什么区别吗?

#include<stdio.h>

void main()
{
        int a = 1, b = 5, c = 8, y;
        y = (a+b), (b+c);
        printf("%d\n", y);
}

还有就是逗号运算符是以表达式2的值当做整个表达式的值,可为啥我这题却是以表达式1的值当整个表达式的值呢?

竹逸 发表于 2022-8-9 17:56:19



这是以表达式1的结果当整个表达式的结果了


一点点儿 发表于 2022-8-9 18:23:05

本帖最后由 一点点儿 于 2022-8-9 18:35 编辑

优先级:赋值运算符>逗号运算符

下面的代码和上面代码的区别是先声明y再运算

y = (a+b), (b+c)
因为优先级:赋值运算符>逗号运算符
会先运行 y = (a+b)
y就为6了
y = (a+b), (b+c)相当于 (y = (a+b)), (b+c)
逗号表达式的值还是表达式2的值,只不过逗号表达式的值没有赋给y,y的值不是逗号表达式的值。实际上这里逗号表达式的值没有赋给任何一个变量,我们看不到是多少

如果用z得到逗号表达式的值,再打印y和z,如下面代码所示

#include <stdio.h>

int main() {
        int a = 1, b = 5, c = 8, y, z;
        z = ( y = (a + b), (b + c));
        printf("%d %d\n", y, z);
}
运行结果为: 6 13
可以发现逗号表达式的值还是表达式2的值



竹逸 发表于 2022-8-9 19:02:37

一点点儿 发表于 2022-8-9 18:23
优先级:赋值运算符>逗号运算符

下面的代码和上面代码的区别是先声明y再运算


那最上面的为啥编译不了,是语法错误吗

竹逸 发表于 2022-8-9 19:15:24

课件里说表达式2的值是y的值,我编译运行了,发现表达式1才是对的{:10_247:}怪不得出新课件,这老课件有错误的地方{:10_266:}

一点点儿 发表于 2022-8-9 19:30:01

竹逸 发表于 2022-8-9 19:02
那最上面的为啥编译不了,是语法错误吗

应该是
应该先声明变量再进行运算

ba21 发表于 2022-8-9 20:52:26

一点点儿 发表于 2022-8-9 18:23
优先级:赋值运算符>逗号运算符

下面的代码和上面代码的区别是先声明y再运算


z = ( y = (a + b), (b + c));
这句其实是这个意思
如:z = (5, 8) 首先运行()中的内容,按顺序获得5,然后获得8,最后把 8赋值给 z; 最后 z = 8;

竹逸 发表于 2022-8-9 21:01:38

一点点儿 发表于 2022-8-9 19:30
应该是
应该先声明变量再进行运算

可为啥 int a=1 就行,这不也是声明和运算一起的么?是因为用常量赋值可以,而变量不行?

一点点儿 发表于 2022-8-9 21:08:14

竹逸 发表于 2022-8-9 21:01
可为啥 int a=1 就行,这不也是声明和运算一起的么?是因为用常量赋值可以,而变量不行?

应该先声明再进行逗号运算

竹逸 发表于 2022-8-15 12:22:42

我知道为啥最上的代码错误了,因为变量声明重复了,int y=a+b,b+c这条语句是变量声明,逗号运算符在这里的作用是起到给多个变量间隔,而后面的b+c在上面已经声明了过了,重复声明报错
页: [1]
查看完整版本: 我这代码这么编译不了