下面的表达式会输出什么?为什么?

时间:2015-03-11 18:22:32

标签: c unix

printf(&unix["\021C%set"],(unix)["Chb"]+"Trick"-0X67);

它输出为" Cricket"。但我无法理解为什么? http://ideone.com/fTEAHG

2 个答案:

答案 0 :(得分:4)

unixpredefined macro indicating it's a Unix-like system

在C中,index[array]array[index]相同。正如MSDN所述:

  

通常, postfix-expression 表示的值是指针值,例如数组标识符, expression 是一个整数值(包括枚举类型)。但是,语法上所需要的只是其中一个表达式是指针类型而另一个是整数类型。因此,积分值可以在后缀表达式位置,指针值可以在表达式或下标位置的括号中。

所以

printf(&unix["\021C%set"],(unix)["Chb"]+"Trick"-0X67);

转换为

printf(&"(\021C%set"[1]),"Chb"[1]+"Trick"-0X67);

&("\021C%set"[1])获取" \ 021C%set"的第一个元素的地址,这相当于取" C%set"的地址。 (由于C指针算术)。简化,并重新安排一些操作数:

printf("C%set","Trick"+"Chb"[1]-0X67);

"Chb"[1]'h',其值为ASCII值0x68,因此"Chb"[1]-0X67为1,"Trick"+1"rick"(由于C指针运算)。所以代码进一步简化为

printf("C%set","rick");

打印" Cricket。"

答案 1 :(得分:1)

嗯,unix在这个实现中是1。 a[b]类似于*(a+b)a+b类似于b+a,因此&unix["\021C%set"]类似&(*("\021C%set"+1))。由于&(*(c))或多或少只是c,因此会得到"\021C%set"+1,这是指向第二个字符的指针,因此只有"C%set",这是&的格式字符串#34; C"然后是一个字符串,然后是" et"。 \021是一个八进制转义符(长度为1到3个八进制数;无论多少都有效),因此它只计为一个字符。

接下来我们有(unix)["Chb"],出于同样的原因与" Chb" [1]相同,这将是' h'字符,ASCII为104.另一方面,0X67为103.所以我们有104+"Trick"-103"Trick"+1。这是左侧使用的字符串文字事物上的相同指针算法,它可以让你" rick"。

所以我们离开了:

printf("C%set", "rick");

哪些版画" rick"在" C"之间和" et" (蟋蟀)。