C 中的指针 (while(*s1++ = *s2++))
Pointer in C (while(*s1++ = *s2++))
对于下面的程序
#include<stdio.h>
int main()
{
char str1[] = "India";
char str2[] = "BIX";
char *s1 = str1, *s2=str2;
while(*s1++ = *s2++)
printf("%s", str1);
printf("\n");
return 0;
}
while 循环中的条件如何计算?我可以在堆栈溢出 here, but they didn't give explanation how * operator has greater precedence than postfix operator.But actually, postfix operator has greater precedence than * (Derefernce) operator. Precedence table for our reference here
中看到类似的 post
请解释此代码如何在输出下方打印
BndiaBIdiaBIXia
如果我没误会你,你必须写
while(*s1++ == *s2++)
printf("%s",str1);
否则你只是替换而不是比较 str1[i] 和 str2[i]。
条件中的赋值加上 %s
格式字符串解释了这一点:
拆分条件
c2 = s2;
c1 = s1;
condition = *c1 = *s2;
++s1, ++s2;
所以条件判断指针s2
是否没有指向空字符
B
、I
和 X
就是这种情况。第三次迭代 s2
将位于字符串文字 BIX
.
的空终止符处
每次迭代,打印str1
的内容。对于第一个 运行,第一个字符已被 BIX
中的 B
覆盖。对于第二个 运行,第二个字符已被 I
覆盖。最后 运行,你得到 BIXia
。如果您添加一个换行符,这会更清楚:printf("%s\n", str1);
将在单独的行上打印每个迭代。
注意:您可能将 =
与 ==
混淆了,而您实际上是在寻找不匹配的地方;这是一个很常见的错误。
while(*s1++ == *s2++) {...}
运算符优先级和执行顺序不一定是一回事。
*s1++ = *s2++
编译器计算如下:
- 编译器认为“++”具有最高的优先级。因为它是 post-increment operator,所以它只是记录了指针需要在 在 评估之后递增的事实表达式的完成。
- 编译器看到“*”运算符,告诉它应该取消引用 s2,并将其用作 RHS
- 同样在赋值的左侧,s1 的
char
被设置为 s2 的 char
的值
- 编译器返回注意在表达式求值后需要递增指针并这样做。
即使 ++
的优先级高于 *
,它仍然最后完成。这里的优先级只是意味着必须对 指针 进行 post 递增操作,而不是对指针 处的 值
一元星号“*”运算符具有从右到左的关联,而不是作为后缀递增“++”运算符的从左到右的关联。因此,在此示例中首先评估一元星号。这与 LALR 解析器的工作方式有关。
对于下面的程序
#include<stdio.h>
int main()
{
char str1[] = "India";
char str2[] = "BIX";
char *s1 = str1, *s2=str2;
while(*s1++ = *s2++)
printf("%s", str1);
printf("\n");
return 0;
}
while 循环中的条件如何计算?我可以在堆栈溢出 here, but they didn't give explanation how * operator has greater precedence than postfix operator.But actually, postfix operator has greater precedence than * (Derefernce) operator. Precedence table for our reference here
中看到类似的 post请解释此代码如何在输出下方打印
BndiaBIdiaBIXia
如果我没误会你,你必须写
while(*s1++ == *s2++)
printf("%s",str1);
否则你只是替换而不是比较 str1[i] 和 str2[i]。
条件中的赋值加上 %s
格式字符串解释了这一点:
拆分条件
c2 = s2;
c1 = s1;
condition = *c1 = *s2;
++s1, ++s2;
所以条件判断指针s2
是否没有指向空字符
B
、I
和 X
就是这种情况。第三次迭代 s2
将位于字符串文字 BIX
.
每次迭代,打印str1
的内容。对于第一个 运行,第一个字符已被 BIX
中的 B
覆盖。对于第二个 运行,第二个字符已被 I
覆盖。最后 运行,你得到 BIXia
。如果您添加一个换行符,这会更清楚:printf("%s\n", str1);
将在单独的行上打印每个迭代。
注意:您可能将 =
与 ==
混淆了,而您实际上是在寻找不匹配的地方;这是一个很常见的错误。
while(*s1++ == *s2++) {...}
运算符优先级和执行顺序不一定是一回事。
*s1++ = *s2++
编译器计算如下:
- 编译器认为“++”具有最高的优先级。因为它是 post-increment operator,所以它只是记录了指针需要在 在 评估之后递增的事实表达式的完成。
- 编译器看到“*”运算符,告诉它应该取消引用 s2,并将其用作 RHS
- 同样在赋值的左侧,s1 的
char
被设置为 s2 的 - 编译器返回注意在表达式求值后需要递增指针并这样做。
char
的值
即使 ++
的优先级高于 *
,它仍然最后完成。这里的优先级只是意味着必须对 指针 进行 post 递增操作,而不是对指针 处的 值
一元星号“*”运算符具有从右到左的关联,而不是作为后缀递增“++”运算符的从左到右的关联。因此,在此示例中首先评估一元星号。这与 LALR 解析器的工作方式有关。