在即将进行的c考试中,我们有一个问题可以给您额外的荣誉。
这个问题总是与各种打印类型的棘手语法有关。
总的来说,我理解我遇到的所有问题,但是特别是有两个问题让我感到困惑:
以下程序的输出是什么?
#include <stdio.h>
void main(){
printf ("%c", '&'&'&');
}
answer:&
以下程序的输出是什么?
#include <stdio.h>
#include <string.h>
void main(){
printf("%c",strcmp("***","**")*'*');
}
answer:*
如您所见,这些问题非常相似。 我的问题是,为什么这是输出?
关于第一个问题:我了解一个字符在逻辑上始终为TRUE,并且将TRUE与TRUE进行AND-ing也可以为TRUE(或1),但是为什么要将1转换为'&',为什么不从ASCII表中将char等效为1? (请注意,必须打印%c,而不是%d)
关于第二个问题:我理解strcmp根据“首先出现在字典中”的值返回一个int,在本示例中将得出1,但是为什么将其与char'*'相乘(同样,逻辑-明智地等于1)会导致将(1 * 1 = 1)转换为char'*'?
答案 0 :(得分:5)
对于第一个问题,表达式为'&' & '&'
,其中&
是按位 AND运算符(不是逻辑运算符)。通过按位与,x & x
的结果为x
,因此在这种情况下,结果仅为字符'&'
。
对于第二个问题,假设调用strcmp()
的结果为1
,则可以将表达式简化为1 * '*'
,即'*'
。 (请注意,如@rici在上面的评论中所述,在这种情况下,不能保证strcmp
的结果为1,只能保证它是一个大于0的整数,因此您不应该依赖于此。行为,因此这个问题是个坏问题。
答案 1 :(得分:1)
'&'
是类型int
的常量。 '&'&'&'
具有与'&'
相同的值和类型,因为对于任何a & a
a
,int
是a
。因此输出等于printf ("%c", '&');
。
第二个代码段的分析更加困难。 strcmp
的结果为正数。然后乘以'*'
(对于C支持的任何 encoding ,该值必须为正数)。那是int
,但是值是实现定义的(取决于平台上的编码和平台对strcmp
的实现),并且%c
的行为取决于char
在您的平台上。如果结果太大而无法容纳char
,并且char
为unsigned
,则将值转换为具有常规环绕行为的char
。如果char
为signed
,则转换是实现定义的,并且可能引发实现定义的信号。