了解C语言中的语法难题

时间:2018-06-20 15:10:04

标签: c syntax printf

在即将进行的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'*'?

2 个答案:

答案 0 :(得分:5)

对于第一个问题,表达式为'&' & '&',其中&按位 AND运算符(不是逻辑运算符)。通过按位与,x & x的结果为x,因此在这种情况下,结果仅为字符'&'

对于第二个问题,假设调用strcmp()的结果为1,则可以将表达式简化为1 * '*',即'*'。 (请注意,如@rici在上面的评论中所述,在这种情况下,不能保证strcmp的结果为1,只能保证它是一个大于0的整数,因此您不应该依赖于此。行为,因此这个问题是个坏问题。

答案 1 :(得分:1)

  1. '&'是类型int的常量。 '&'&'&'具有与'&'相同的值和类型,因为对于任何a & a ainta。因此输出等于printf ("%c", '&');

  2. 第二个代码段的分析更加困难。 strcmp的结果为正数。然后乘以'*'(对于C支持的任何 encoding ,该值必须为正数)。那是int,但是值是实现定义的(取决于平台上的编码和平台对strcmp的实现),并且%c的行为取决于char在您的平台上。如果结果太大而无法容纳char,并且charunsigned,则将值转换为具有常规环绕行为的char。如果charsigned,则转换是实现定义的,并且可能引发实现​​定义的信号。