半开玩笑地半开玩笑:为什么我不能++i++
用C语言,特别是在C#中?
我希望它增加值,在我的表达式中使用它,然后再次递增.
尽管简短的回答"它不是一个左值"是正确的,但这或许只是在乞求这个问题.为什么它不是左值?或者,正如我们在C#中所说的,一个变量.
原因是因为你不能吃蛋糕也不能吃.按逻辑处理:
首先,C#中的++运算符的含义,无论是后缀还是前缀,都是"获取此变量的值,递增值,将新值赋给变量,并生成值作为结果".作为结果生成的值是原始值或递增值,具体取决于它是后缀还是前缀.但不管怎样,你产生了一个价值.
其次,变量的值始终是该变量的当前内容.(模拟某些奇怪的线程场景会让我们远远不够.)
我希望你同意这些是完全明智的规则.
现在应该清楚为什么i ++的结果不能变量,但如果不是,请让我说清楚:
假设我是10. i ++的含义应该是"得到i - 10的值 - 增加它 - 11 - 存储它 - 我现在是11 - 并给出原始值作为结果 - 10".所以当你说print(i ++)它应该打印10,而11应该存储在i中.
现在假设i ++的含义是返回变量,而不是值.你说print(i ++)会发生什么?你得到i - 10的值 - 增加它 - 11 - 存储它 - 我现在是11 - 并且结果给出变量.变量的当前值是多少?11!这正是你不想打印的内容.
简而言之,如果i ++返回一个变量,那么它将完全与运算符的预期含义完全相反!你的提议在逻辑上是不一致的,这就是为什么没有语言这样做的原因.
简答:i++
不是"左值",所以不能成为作业的主题.
因为你关心下一个程序员维护(或试图重写)你的代码,很久你因为违反流行的约定而被解雇了.
我测试了(++ i,i ++)作为解决方法:
#includeint 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
因为结果i++
不是左值.