鱼C论坛

 找回密码
 立即注册
查看: 1701|回复: 9

[已解决]我这代码这么编译不了

[复制链接]
发表于 2022-8-9 17:53:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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 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的值



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-9 17:56:19 | 显示全部楼层
捕获02.JPG

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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的值



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-9 19:02:37 From FishC Mobile | 显示全部楼层
一点点儿 发表于 2022-8-9 18:23
优先级:赋值运算符>逗号运算符

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

那最上面的为啥编译不了,是语法错误吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-9 19:15:24 From FishC Mobile | 显示全部楼层
课件里说表达式2的值是y的值,我编译运行了,发现表达式1才是对的怪不得出新课件,这老课件有错误的地方
IMG_20220809_191110.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-9 19:30:01 | 显示全部楼层
竹逸 发表于 2022-8-9 19:02
那最上面的为啥编译不了,是语法错误吗

应该是
应该先声明变量再进行运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-9 21:01:38 From FishC Mobile | 显示全部楼层
一点点儿 发表于 2022-8-9 19:30
应该是
应该先声明变量再进行运算

可为啥 int a=1 就行,这不也是声明和运算一起的么?是因为用常量赋值可以,而变量不行?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

应该先声明再进行逗号运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-15 12:22:42 From FishC Mobile | 显示全部楼层
我知道为啥最上的代码错误了,因为变量声明重复了,int y=a+b,b+c这条语句是变量声明,逗号运算符在这里的作用是起到给多个变量间隔,而后面的b+c在上面已经声明了过了,重复声明报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 12:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表