【问题标题】:Can you have a incrementor and a decrementor on the same variable in the same statement in c你可以在c中的同一个语句中对同一个变量有一个增​​量器和一个减量器吗
【发布时间】:2012-07-25 15:03:44
【问题描述】:

--foo++;

C 中的有效语句? (它会编译/运行)这有什么实际应用吗?

很抱歉在编辑中更改了问题,但我发现了一些问题。

根据我的 C++ 编译器(Visual Studio 2010):

--++foo;

是一个有效的命令但是

foo--++; 

不是。这有什么原因吗?

【问题讨论】:

  • 为什么?这会有什么目的? (没有投反对票,但这让我想知道为什么有人甚至想知道这个 - 谁会编写这样的代码)
  • 首要问题是这是否是合法的命令。
  • 这个问题的第一部分是反复试验。第二部分是用你的脑袋...
  • @nos 不知道会发生什么,但想知道为什么甚至会出现这种情况——我认为这样的代码没有多大好处。
  • @nos 问题是它是否是一个有效的声明(即编译器没有抱怨)。不是结果如何。通过将--foo++ 提供给编译器,可以轻松确定--foo++ 是否为“有效语句”。没有错误说“有效”。

标签: c++ c post-increment pre-increment


【解决方案1】:

由于这是一个 C 表达式,它应该遵循一些级联评估步骤来找出结果。

你的表情是

--++foo;

好的,让我们评估一下 第一步:-

++foo;

必须进行评估才能继续

这是一些如何预先增加,所以 foo 变成 foo+1 。

然后分配发生

这就是评估为 foo=foo+1;

和 foo 的值返回以分配给变量(如果不存在则忽略)。

所以现在我们的表达式如下所示

--(++foo);评估为

--(一个常数值);//foo+1的结果

再一次评估像这样的语句

a constant value=constant_valu+1;//右边没问题,左边不是变量

因为赋值运算符的左侧不是变量并引发错误。

所以现在没有有效的操作数 -- /decrement operator So lvalue required error

【讨论】:

    【解决方案2】:

    不,它无效,因为递增/递减运算符的结果不是左值。

    编辑: OP 通过添加另外两个示例来编辑他的问题。所以我们开始了,出于同样的原因:

    --++foo;
    --foo++;
    foo--++;
    

    都是无效的表达式语句,因为递增/递减运算符的结果不是左值。编译器可以扩展语言并接受这些表达式,但严格遵守的程序不能包含任何这些表达式。

    【讨论】:

    • 其实是预增is一个lValue的结果。
    • @RichardJ.RossIII ++E 等价于E+=1 并且简单赋值和复合赋值的结果不是左值 (C99, 6.5.16p3) "赋值表达式有赋值后左操作数的值,但不是左值。”
    • 很抱歉,这是正确的答案,反对票的人 (@RichardJ.RossIII) 请删除反对票。
    • 混淆的部分原因是在 C++ 中,赋值表达式 is 是一个左值,前缀递增和递减也是如此。但由于这个问题被标记为 C,那么@ouah 是对的。
    • 是的,抱歉,我创建了一个新问题来解决 C++,但将部分留在此处(进行说明)以使此答案继续有意义。
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多