繁体   English   中英

cout<<4%-8的输出如何; 是 4?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM