我遇到了一段代码,其中
<=
用于 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?
本声明
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
.
关系表达式的结果是 0(如果表达式为假)或 1(如果表达式为真)。
所以
m += x * y + z++ <= m + 3;
如果m
的结果小于或等于
x * y + z++
的结果,将在
m + 3
上加1,否则为0。
根据
x
、y
、z
和m
的初始值,关系表达式的计算结果应为真。
永远,永远不要写这样的代码。这是坏。是的,我对在作业中以类似的方式使用关系和逻辑表达式感到内疚,但没有那么多副作用。