意外输出,但代码没有错

时间:2014-12-14 19:07:23

标签: c pointers

我尝试在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;。

的所需输出

2 个答案:

答案 0 :(得分:2)

您的代码导致未定义的行为。如果使用前置或后置递增/递减运算符,则在同一语句中多次引用指针是无效的。

将您的代码更改为:

*p = toupper(*p);
p++;

这将确保指针p仅在使用之后更改。

答案 1 :(得分:0)

根据C标准(6.5.16分配操作员)

  

3 ..更新左操作数的存储值的副作用   在左右值计算之后排序   操作数。 对操作数的评估未经过排序

所以你的程序有不确定的行为。

例如MS VS 2014按预期输出

THE ONLY WAY