【问题标题】:What is the output of this code? Am i missing something here?这段代码的输出是什么?我在这里错过了什么吗?
【发布时间】:2016-11-01 05:50:42
【问题描述】:
void main()
{
    int num, a=15; 
    num = ----a--;
    cout<<num;
    cout<<a;
 }

我试过了......我应该得到 15 14 在纸面上,因为 4 减去相互抵消,剩下的是 --

但在 PC 上我得到编译错误,因为 a-- 之前的 ---- 使编译器认为这个 '----' 中有前/后减量运算符并要求一个操作数。解决办法是什么?

【问题讨论】:

  • 解决办法是不要使用这样一段混淆的代码,清楚地表达你想要做什么。编程已经够难了,为什么要让它变得比它需要的更难?
  • 为什么---- 会互相抵消? -- 递减,所以我不明白为什么其中两个会递减和递增。除此之外,当遇到编译器错误时,您应该完整地发布确切的错误,而不是试图描述它。
  • 为什么所有的反对票?关于操作符绑定、左值等有一些有用的讨论。
  • 输出是编译器错误。错误的内容取决于编译器。
  • @NiranjanDixit 由于最大蒙克规则,它将其解释为连续两个预减量并给出错误,因为您正试图将其应用于 r 值。您帖子中的代码是非法的,预计会出错。

标签: c++ operators increment decrement


【解决方案1】:

一个正确的程序可以看起来像下面这样

#include <iostream>

int main() 
{
    int num, a = 15; 
    num = ( ----a )--;

    std::cout << num << std::endl;
    std::cout << a << std::endl;

    return 0;
}

它的输出是

13
12

后减运算符的优先级高于前减运算符,其结果为rvalue,不可更改。

这个表达式

----a--

等价于

----( a-- )

并且不会编译。

所以你需要使用括号来让程序编译。

以C语言编写的相应程序为例

#include <stdio.h>

int main( void ) 
{
    int num, a = 15; 
    num = ( ----a )--;

    printf( "%d\n", num );
    printf( "%d\n", a );

    return 0;
}

将无法编译,因为 C 中的预减运算符也返回右值,您可能无法将运算符应用于右值。

只有 C++ 程序有效。

【讨论】:

  • 但问题是未经修改的版本(我输入的内容)正是前一年考试中曾经问过的内容。所以程序外面写成“编译错误不会产生o/p”?
  • 但问题是未经修改的版本(我输入的内容)正是前一年考试中曾经问过的内容。所以程序外面写成“编译错误不会产生o/p”?
  • @NiranjanDixit 是的,原来的代码不会编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多