我尝试在CodeBlocks(版本13.12)上编译它。不知何故,指针在toupper()
调用之前递增#include <stdio.h>
#include <ctype.h>
int main(void)
{
char str[80] = "the only way";
char *p;
p = str;
while(*p){
*p++ = toupper(*p);
}
printf(str);
return 0;
}
这导致输出&#34; HE ONLY WAY&#34;我在哪里寻找输出&#34;唯一的方式&#34;。我在计算机上尝试了它,它输出错误。但是,当我在朋友计算机上尝试此代码时,代码运行良好,给出输出&#34; THE ONLY WAY&#34;。 我的问题是为什么我的输出有所不同? P.s如果我替换
* p ++ = toupper(* p);
带
* p ++ = toupper(*(p-1));
我得到了#34;唯一方式&#34;。
的所需输出答案 0 :(得分:2)
您的代码导致未定义的行为。如果使用前置或后置递增/递减运算符,则在同一语句中多次引用指针是无效的。
将您的代码更改为:
*p = toupper(*p);
p++;
这将确保指针p
仅在使用之后更改。
答案 1 :(得分:0)
根据C标准(6.5.16分配操作员)
3 ..更新左操作数的存储值的副作用 在左右值计算之后排序 操作数。 对操作数的评估未经过排序。
所以你的程序有不确定的行为。
例如MS VS 2014按预期输出
THE ONLY WAY