对于下面的程序
#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循环中的条件是如何计算的?我可以在stack overflow中看到类似的帖子,但是他们没有解释为什么*操作符比后缀操作符具有更高的优先级。但实际上,后缀操作符比*(解引用)操作符具有更高的优先级。这里引用的优先级表
请解释输出
下面的代码是如何打印的BndiaBIdiaBIXia
操作符的优先级和执行顺序不一定相同。
*s1++ = *s2++
由编译器按如下方式求值:
- 编译器看到具有最高优先级的"++"。因为它是自增后操作符,它只是注意到在表达式求值完成后需要对指针进行自增的事实。
- 编译器看到"*"操作符,告诉它应该取消对s2的引用,并将其作为RHS
- 赋值左侧相同,s1处的
char
被设置为s2处的char
的值- 编译器回到它的注意,指针需要在表达式求值后递增,并这样做。
即使++
的优先级高于*
,它仍然是最后做的。这里的优先级只是指必须对指针进行后增量操作,而不是对
条件内的赋值加上%s
格式字符串解释了这一点:
拆分条件
c2 = s2;
c1 = s1;
condition = *c1 = *s2;
++s1, ++s2;
因此,条件求值为指针s2
是否不指向空字符。
对于B
、I
和X
都是如此。第三次迭代时,s2
将位于字符串字面值BIX
的空终止符处。
对于每次迭代,打印str1
的内容。对于第一次运行,第一个字符已经被BIX
中的B
覆盖。对于第二次运行,第二个字符已被I
覆盖。对于最后一次运行,您将获得BIXia
。如果您附加一个换行符,这将更清楚:printf("%sn", str1);
将在单独的行上打印每个迭代。
注意:你可能混淆了=
和==
,你实际上是在寻找不匹配的;这是一个很常见的错误。
while(*s1++ == *s2++) {...}
如果我没记错的话,你必须写
while(*s1++ == *s2++)
printf("%s",str1);
否则你只是替换而不是比较str1[i]与str2[i]。
一元星号'*'操作符具有从右到左的关联,而不像后缀自增'++'操作符那样具有从左到右的关联。因此,在本例中首先计算一元星号。这与LALR解析器的工作方式有关。
见http://www.swansontec.com/sopc.html