[英]how the output of cout<<4%-8; is 4?
int main() {
cout<<4%-8;
return 0;
}
为什么编译器忽略 - 或 + 符号以及输出如何为 4?? 为什么 cout<<4%*8; 和 cout<<4-%8; 是非法语法吗?
cout<<4%-8的输出如何; 是 4?
操作定义如下:
[expr.mul]
如果商
a/b
在结果的类型中是可表示的,则(a/b)*b + a%b
等于a
;
(4/-8)*(-8) + 4%-8 == 4
4%-8 == 4 - (4/-8)*(-8)
4%-8 == 4 - (0)*(-8)
4%-8 == 4
为什么编译器忽略 - 或 +
如果您查看定义,您可能会发现使用右手操作数的唯一部分: (a/b)*b
,要么为零,要么与左和操作数的符号相同,并且永远不会大于左。 如果非零,结果始终与左侧操作数具有相同的符号。
为什么
cout<<4%*8;
和cout<<4-%8;
是非法语法吗?
因为顶操作者的右手操作数(即操作者被%
在第一, -
在第二),这是*8
和%8
是无效的表达式。 这是因为*
和%
都不是整数的一元运算符( *
是指针的一元运算符,可以为类重载)。 8 是一个整数。
4%-8 = 4% (-8) - 除法后剩余。
4%-8
表示4 mod -8
。 4%*8
意味着4 mod times 8
,这不是你可以做的,所以你会得到一个错误。 使用4-%8
意味着4 minus mod 8
,这也毫无意义并且是错误的。
编译器不会忽略任何东西。
像这样的声明
cout<<4%-8;
是相同的
cout << 4 % (-8);
结果为 4。
另一方面,声明如
cout<<4%*8;
没有意义,因为,
cout<<4% (*8);
^^^^---- invalid syntax (argument).
与cout<<4-%8;
, 在cout<<(4-) % (8);
语句cout<<4%-8;
分组为cout<<(4%(-8));
. 这里-
是一元否定运算符。
4 % (-8)
是4
。 (将%
视为余数运算符而不是数学模数。)
4%*8
被分组为4%(*8)
,这是没有意义的,因为8
不是指针类型,而是int
。
4-%8
没有意义,因为%
从来都不是一元运算符。
余数算术运算符参考: https : //en.cppreference.com/w/cpp/language/operator_arithmetic
回答你问题的第一部分。
为什么编译器忽略 - 或 + 符号?
首先,编译器根本没有忽略-或+符号。
它只是编译器所做的简单数学。 4 X (-8)其-8的答案是什么?
类似地,编译器包含 - 或 + 符号,其中 8 将其视为正整数或负整数,并考虑到它进一步解决了您的数学表达式。
回答问题的第二部分
为什么输出是 4 ?
您正在使用%(模数或余数) ,它给出两个操作数的余数。
在您的情况下,您正在计算 4 除以 8 时的余数,这显然是 4。
我认为相反,您想找出相反的结果,即 8 除以 4 时的余数为 0 。
相同的语法将是。
cout<<(8%4);
当您将 4 除以 -8 时,结果为 -1/2。 如果向 0 取整,除法结果为 0,余数为 4。如果向下取整(向负无穷大),除法结果为 -1,余数为 -4。
当您在代码中编写4%-8
,您要求除这些数字时求余数(不是模数,尽管该名称经常被误用)。 过去,标准允许使用这两种计算方法中的任何一种,余数可以是 4 或 -4,通常取决于硬件如何处理负数除法。 最近要求变了,要求的答案是商是0,余数是4。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.