【发布时间】:2016-02-14 18:03:03
【问题描述】:
我发现了一些有趣的东西,但无法解释。 我正在编写一个简单的例程来反转字符串。这工作正常,没有抱怨。
我的问题在printf。当我单独打印原始字符串时,它打印正确,但是当我将原始字符串打印为第一个 arg 并将函数调用 reverse 作为第二个时,两者都显示为 reversed。
输出:
|| abcdthelgko ||
原始字符串:| okglehtdcba |, Rev Str | okglehtdcba |
代码:
char* ReverseStr(char* str, int len)
{
char *start = &str[0], *end = &str[len-1];
char temp;
while(start < end)
{
temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
return str;
}
int main()
{
char str_unique[] = "abcdthelgko";
int str_unique_len = sizeof(str_unique)/sizeof(str_unique[0]);
printf("\n || %s || \n", str_unique);
printf("Orig Str: | %s |, Rev Str | %s |\n", str_unique, ReverseStr(str_unique, str_unique_len-1));
return 0;
}
* 反馈后修改:* 测试 2 个理论 1、printf从右到左处理cmets 2. 如果函数调用是其中一个 args,则在 printf 之前调用该函数, 我做了另一个示例代码来更改通过引用传递的变量的值。我看到的是,在变量值中,它可以正常工作: ================== 输出======================
i = 5, changed i = 2, again i= 2
changed i = 2, i= 2
i = 5, changed i = 2
===================代码======================
int* change (int* addr);
int main()
{
int i;
i=5;
printf("\n i = %d, changed i = %d, again i= %d \n ", i, *change(&i), i);
i=5;
printf("\n changed i = %d, i= %d \n", *change(&i), i);
i=5;
printf("\n i = %d, changed i = %d \n", i, *change(&i));
return 0;
}
int* change (int* addr)
{
*addr = 2;
return (addr);
}
【问题讨论】:
-
提示:尝试使用与第一个相同的第三个 printf。
-
嗨,为了检查理论,printf 从右到左处理参数,或者如果函数调用是 printf 的参数,在调用 printf 函数之前首先处理,我写了另一个代码。而不是 str reverse,我尝试了一个简单的实验来更改 ref 传递的变量值......在这种情况下,我看到了原始输出。 i 是 = 5,我将 i 的地址传递给在该位置写入 2 的函数:
[CODE]: printf("\n i = %d, changed i = %d \n", i, *change(&i)); [OUTPUT]: i = 5, changed i = 2
标签: c string pointers arguments printf