理解c中的语法谜题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解c中的语法谜题相关的知识,希望对你有一定的参考价值。
在即将到来的c考试中,我们有一个问题可以为您提供额外的学分。
问题始终与各种打印类型的棘手语法有关。
总的来说,我理解了我所经历的所有问题,但有两个问题让我感到困惑:
以下程序的输出是什么?
#include <stdio.h>
void main(){
printf ("%c", '&'&'&');
}
回答:&
以下程序的输出是什么?
#include <stdio.h>
#include <string.h>
void main(){
printf("%c",strcmp("***","**")*'*');
}
回答:*
正如您所看到的,问题非常相似。我的问题是,为什么这是输出?
关于第一个问题:我理解一个字符,逻辑方面,总是为TRUE,并且使用TRUE AND-TRUE给你TRUE(或1),但为什么它会将1转换为'&',为什么不呢? ASCII表中的char等价于1? (注意%c的必要打印而不是%d)
关于第二个问题:我理解strcmp根据'首先出现在字典中'的值返回一个int,在这个例子中将导致1但是为什么将它与char'*'相乘(再次,逻辑方面等于1)会导致转换(1 * 1 = 1)为char'*'?
答案
对于第一个问题,表达式是'&' & '&'
,其中&
是按位AND运算符(不是逻辑运算符)。使用按位AND,x & x
的结果是x
,因此在这种情况下的结果只是字符'&'
。
对于第二个问题,假设调用strcmp()
的结果是1
,则可以将表达式简化为1 * '*'
,这只是'*'
。 (请注意,正如@rici在上面的注释中提到的那样,strcmp
的结果在这种情况下不保证为1,只是它将是一个> 0的整数,所以你不应该依赖这种行为,因此问题是不好的问题)。
另一答案
'&'
是int
类型的常数。'&'&'&'
具有与'&'
相同的价值和类型,因为a & a
是任何a
int
的a
。所以输出相当于printf ("%c", '&');
。- 对第二个片段的分析更加困难。
strcmp
的结果是一个正数。并乘以'*'
(对于C支持的任何编码,它必须是正数)。这是一个int
,但价值是实现定义的(取决于您平台上的编码和您的平台的strcmp
实现),%c
的行为取决于您平台上char
的签名或其他方面。如果结果太大而无法放入char
,并且char
是unsigned
,则该值将转换为具有正常环绕行为的char
。如果char
是signed
,则转换是实现定义的,并且可能引发实现定义的信号。
以上是关于理解c中的语法谜题的主要内容,如果未能解决你的问题,请参考以下文章
在下面的代码片段中的剩余 ='passthrough' 处的代码中出现语法错误