C语言自增和变量声明

3
我对一道C语言练习题有疑问,以下是程序的输出,请显示该程序的输出结果。
x = y = 3;
y = x++, x++;
printf("x = %d, y = %d\n", x, y);

答案:

1 x = 5, y = 3

我不理解这是什么意思。

x++, x++ 

x++ 的意思是将 x 的值赋给 y ,然后将 x 的值加 1,但为什么有逗号?这是因为在一条语句中同时执行两个操作。它只会将 x 的值加到 y 中一次,然后将 x 的值加 1。

我尝试在编译器中运行它,遇到了一些困难。


这个能编译吗?在我的系统上,gcc在第二个“x ++”处出现了问题。 - John Carter
2
表达式 l, r逗号运算符,它评估 l 并丢弃结果,然后评估 r 并返回其结果。增量运算符是 x++ 评估的一部分,这意味着 x 增加了两次。 - Some programmer dude
逗号运算符的更多信息 https://dev59.com/OnVD5IYBdhLWcg3wNIzc/ - General Grievance
2
不用说,你永远不应该写出这样的代码。它只能作为测试问题的素材。 - Robert Harvey
2个回答

4
在这个陈述中:
y = x++, x++;

它包含赋值运算符、逗号运算符和后缀增量运算符。其中,后缀增量运算符的优先级最高,其次是赋值运算符,然后是逗号运算符。因此,表达式解析为:

(y = (x++)), (x++);

逗号运算符首先对其左操作数进行任何副作用的评估,并丢弃该操作数的值。在它评估右操作数之前,这里有一个序列点,这意味着评估左边和所有副作用都保证在右边发生。

因此,让我们首先看逗号运算符的左操作数:

y = (x++)

子表达式x++的计算结果为x当前值,并作为副作用递增x。此时x的值为3,因此y被赋值为3,而x递增为4。

现在看右边:

x++

由于x当前的值为4,它被增加以包含值5。

因此,在最后,x为5,y为3。


谢谢,现在我明白多了。之前感觉有这样的东西,但是没有得到合适的解释。再次感谢。 - Sebastien Fnt

1

有一篇维基百科页面介绍了C和C++中的逗号运算符:https://en.wikipedia.org/wiki/Comma_operator

它基本上从左到右评估两个表达式,并返回第二个表达式的值。

在这里,您可以看到c ++中运算符的优先级: https://en.cppreference.com/w/cpp/language/operator_precedence

逗号运算符的优先级最低。

在您的示例中。 第一行将xy都设置为3。 第二行将x增加两次:x ++,x ++。 但是,由于赋值运算符的优先级高于逗号运算符,因此y获取第一个递增返回的值。 该语句被评估为(y = x ++),x ++。 首先执行第一个x ++x获得值4并返回3。 这个值被分配给yy = x ++。 然后,最后一个x ++被评估,x获得值5


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接