当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能用C-like语言做++ i ++?

如何解决《为什么我不能用C-like语言做++i++?》经验,为你挑选了5个好方法。

半开玩笑地半开玩笑:为什么我不能++i++用C语言,特别是在C#中?

我希望它增加值,在我的表达式中使用它,然后再次递增.



1> Eric Lippert..:

尽管简短的回答"它不是一个左值"是正确的,但这或许只是在乞求这个问题.为什么它不是左值?或者,正如我们在C#中所说的,一个变量.

原因是因为你不能吃蛋糕也不能吃.按逻辑处理:

首先,C#中的++运算符的含义,无论是后缀还是前缀,都是"获取此变量的值,递增值,将新值赋给变量,并生成值作为结果".作为结果生成的值是原始值或递增值,具体取决于它是后缀还是前缀.但不管怎样,你产生了一个价值.

其次,变量的值始终是该变量的当前内容.(模拟某些奇怪的线程场景会让我们远远不够.)

我希望你同意这些是完全明智的规则.

现在应该清楚为什么i ++的结果不能变量,但如果不是,请让我说清楚:

假设我是10. i ++的含义应该是"得到i - 10的值 - 增加它 - 11 - 存储它 - 我现在是11 - 并给出原始值作为结果 - 10".所以当你说print(i ++)它应该打印10,而11应该存储在i中.

现在假设i ++的含义是返回变量,而不是.你说print(i ++)会发生什么?你得到i - 10的值 - 增加它 - 11 - 存储它 - 我现在是11 - 并且结果给出变量.变量的当前值是多少?11!这正是你不想打印的内容.

简而言之,如果i ++返回一个变量,那么它将完全与运算符的预期含义完全相反!你的提议在逻辑上是不一致的,这就是为什么没有语言这样做的原因.


马丁,我的解释既准确又准确; 我在谈论C#语义,而不是C或C++语义,因为这是原始海报特别要求的.我会在文中做得更清楚.
很好的解释

2> Simon Nicker..:

简答:i++不是"左值",所以不能成为作业的主题.


`++ i`是一个左值,所以`(++ i)++`是有效的,但事实是它在没有插入序列点的情况下写入`i`两次.问题是语法指定`++ i ++`等同于`++(i ++)`.
后增量优先于预增量; 你想说`i ++`不是左值,而不是'++ i`.(虽然它不起作用)

3> vehomzzz..:

因为你关心下一个程序员维护(或试图重写)你的代码,很久你因为违反流行的约定而被解雇了.


不幸的是,许多c ++(希望在下一个标准中被修复)是不道德的,在政治上不正确使用,但合法......
这就是为什么它是"不道德的",但事实上它既是非法的,也是不道德的.

4> sambowry..:

我测试了(++ i,i ++)作为解决方法:

#include  

int main(){
  int i=0;

  printf(" i:         %i\n", i         );
  printf(" (++i,i++): %i\n", (++i,i++) );
  printf(" i:         %i\n", i         );
}

结果:

i:         0
(++i,i++): 1
i:         2


我的眼睛,我的眼睛!

5> Stephen Cano..:

因为结果i++不是左值.


实际上,后增量优先.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有