c - 带有递增和递减运算符的指针
问题描述
通常,当赋值运算符存在时,左操作数应该是变量而不是表达式,但是当我使用指针使左侧成为表达式时,代码不会产生任何错误。
Jdoodle 在线编译器/C
它应该抛出一个错误,但是成功的编译在那里。
https://www.jdoodle.com/c-online-compiler
#include <stdio.h>
int main()
{
int x = 30, *y, *z;
y = &x; // Assume address of x is 1000 and integer is 4 byte size */
z = y;
*y++ = *z++;
x++;
return 0;
}
解决方案
赋值的左操作数不必是变量。例如,以下作业应该并且确实可以很好地工作(我假设您知道这一点并且只是误会了):
array[index] = value;
*ptr = value;
我认为让您感到困惑的*y++ = *z++;
是您认为它分配给增量操作的结果,这确实没有意义。但这不是该表达式的优先级:*y++
等效于*(y++)
, not (*y)++
。因此,您要取消引用的结果,y++
然后为该取消引用的内存位置分配一个值,就像您编写的那样:
int *ptr = y++;
*ptr = *z++;
推荐阅读
- python - 将 PySpark 管道保存到 PMML 并使用 Flask 部署它(根据请求在应用程序中出现错误)
- haskell - args处理haskell
- java - 从 java 6 迁移到 8 时我应该更新 aspectJ 吗?
- reactjs - 重定向反应路由器dom身份验证不起作用
- php - PHP 7.3 卷曲多
- powershell - 使用 PowerShell 为文件夹中的所有文件创建 App Locker 规则/策略
- javascript - history.pushState 和 history.back 逻辑错误
- flutter - Dart - 单击飞镖后如何更改我的 raiseButton 的颜色?
- python - 使用和不使用随机播放的 sklearn KFold 之间的区别
- python - Gmail附件未从python程序下载