【发布时间】:2015-04-13 22:18:53
【问题描述】:
给定下面的代码
char buf[] = "asfsf";
char *a=buf;
++*a++;
cout<<*a;
我希望结果是“s”的下一个字符,即“t”,但结果仍然是“s”。为什么?
为什么 ++*a++ 和
不一样*a++;
++*a;
cout<<*a;
这真的是 ++i++ 的重复问题吗?我知道 ++i++ 是一种未定义的行为,会导致编译错误,但 ++*i++ 实际上可以运行。我的情况也是未定义的行为吗?
【问题讨论】:
-
你应该使用
const char *a="asfsf"; -
这不是一个骗子(至少是指定的副本)。这一个包括取消引用,这意味着两个增量应用于不同的对象(即,一个应用于
a,另一个应用于*a)。这使得它与对同一个对象应用两个增量略有不同(但完全不同)。 -
你的代码应该被避免,即使它是明确定义的行为(不是)。它在我的系统(OS X)上出现
Bus error: 10故障(以及从字符串常量到char*的不推荐转换的警告) -
@vsoftco 它出错了,因为他正在写入只读内存(字符串文字)。 little modification 可能会在没有 ro-overreach 的情况下给出他所看到的内容..
-
@WhozCraig 同意,我使用的最大值仍然是
*a++。不止一个 2++/*运算符只会让阅读您的代码的人感到困惑。