如何在代数表达式中使用关系运算符?

问题描述 投票:0回答:2

我遇到了一段代码,其中

<=
用于 C 中的代数表达式。

int x=2, y=4, z=5, m=10;
m+= x * y + z++ <=m+3;
printf("%d, %d", m,z);

我从未见过以这种方式使用关系运算符,并且想知道它的输出是如何计算的。运行时我收到的输出是 11、6。以什么方式 <= work here?

c operator-precedence post-increment relational-operators
2个回答
3
投票

本声明

m+= x * y + z++ <=m+3;

可以改写成

m += (x * y + z++ ) <= ( m+3 );

由于运算符的优先级。

考虑到这些声明

int x=2, y=4, z=5, m=10;

关系运算符

(x * y + z++ )
的操作数
<=
等于
2 * 4 + 5
等于
13
(注意后缀自增运算符的值是其操作数自增前的值),
m + 3 
也等于
13
。所以关系运算符产生
1
.

事实上你有

m += 1;

来自 C 标准(6.5.8 关系运算符)

6 每个运算符 < (less than), >(大于),<= (less than or equal to), and >=(大于或等于)应产生 1 如果指定的关系为真,如果为假则为 0。107) The 结果的类型为 int.

结果

m
将等于
11
z
由于此语句之后的后缀增量运算符将等于 tp
6
.


1
投票

关系表达式的结果是 0(如果表达式为假)或 1(如果表达式为真)。

所以

m += x * y + z++ <= m + 3;
如果

m

的结果小于或等于
x * y + z++
的结果,
将在
m + 3
上加1,否则为0。

根据

x
y
z
m
的初始值,关系表达式的计算结果应为真。

永远,永远不要写这样的代码。这是。是的,我对在作业中以类似的方式使用关系和逻辑表达式感到内疚,但没有那么多副作用。

© www.soinside.com 2019 - 2024. All rights reserved.