这个c语言程序我看不懂,求教! # include<stdio.h> int main(){ //

这个c语言程序我看不懂,求教!
# include<stdio.h>
int main(){
//为什么是int?下面的char定义的不是字符么。。。
char a,b,c;
while(~scanf("%c%c%c",&a,&b,&c)){
//为什么这里要取反
getchar();
//getchar的用法不是某某=getchar()么。。。这样用是不是另外的意思啊
if(a>b){
a^=b;
b^=a;
a^=b;

}
if(a>c){
a^=c;
c^=a;
a^=c;

}
if(b>c){
b^=c;
c^=b;
b^=c;
}
printf("%c %c %c\n",a,b,c);
}
return 0;
}

你C语言还没入门的赶脚啊!
第一个: int main() //是指main函数的返回值是int型的,与最后的“return 0;”对应。char是申明的程序中变量的类型,你想申明申明类型都可以,两者是完全无关的!
第二个:~scanf 我是没见过这种用法的,百度查了下也没找个,书上更没有,C++中构造函数才有这个用法,~scanf是错误用法。
第三个:c = getchar()是获取一个字符,然后赋值给字符变量c,如果只是getchar();那么仅仅是获取字符,而不做其他的操作。利用这个可以中断程序,等待用户输入任意字符时,才做下一步操作!追问

但是不都已经scanf了么。。。。怎么还要等啊

还有a^=b是什么意思

追答

a^=b就是a=a^b,就是a的b次方!

如果不要~scanf前面的~话,就不需要了!
~用在c语言,真是第一次见到,教材里面都没有的,一般都不用!

O(∩_∩)O

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-14
楼上也是菜鸟啊~~~~
你这一段程序很好,很完整,没有一句多余的内容。
待我慢慢跟你说来:
1、
int main(){
//为什么是int?下面的char定义的不是字符么。。。
答:这里的int跟你下面程序里边的变量无关。它是指main()这个主程序返回的变量类型,当然,大多数主程序不需要返回变量,所以这个int即是必须的(C语言规定的),同时作为初级学习者来讲也是先不用管它的。
2、
char a,b,c;
while(~scanf("%c%c%c",&a,&b,&c)){
//为什么这里要取反
答:这里的~符号不是取反,而是一种并不太规范的特殊用途,它代表把scanf() 进而的变量全部取一遍,如scanf("%c%c%c",&a,&b,&c)是取三个字符,但是如果你输入的多于三个,则每一次只取三个,剩余的留在缓冲区内。与 while(~scanf())(这是一个当循环语句)一起使用,第一次取三个做完循环体后,第二次再回到这一句取三个,.......,直到取完为止,跳出循环。
(先发给你这一部分,后面我继续写)追问

so你快点说啊

追答

3、
getchar();
//getchar的用法不是某某=getchar()么。。。这样用是不是另外的意思啊
答:这一句很巧妙!
因为在上一句输入时,需要你输入三个字符(才能进行下面的工作),但是输入三个字符之后,你还得必须按一个回车键,这个回车键也作为一个字符输入了!也就是你按在屏幕上的只有三个字符,但进入缓冲区的是四个字符:(不妨设你按入的是BOY)“B"、"O"、"Y"、"(回车)”。程序把前三个字符分别赋值给了a='B'、b='O'、c='Y',但是那个回车符却落在了缓冲区。等程序执行完回到第二次运行,你再输入三个字符的时候,如“are"+回车时,这一次缓冲区内可是有五个字符了,分别是“回车、a、r、e、回车”,再给三个变量赋值时,就会出现a="回车"、b="a"、c="r”(它是按先后顺序依次取的),然后缓冲区内就剩下“e"、”回车“两个字符了。很明显,这一次你就不会得到正确的结果了。
正因为有了getchar(),执行这一句时,也会从缓冲区读一个字符,也就是第一次输入时多余的那个回车,但并不给任何变量赋值,但是它读完之后,缓冲区内就空了!!不会影响第二次你再输入三个字符时对程序的影响了!
后面的内容估计你都能看明白了,就有多说了。如果还有不详之处,请再留言。
刚才有点事,让你久等了,很对不起!

soory!
前面
”它代表把scanf() 进而的变量全部取一遍,“
这一句有一个错误,应该是:
”它代表把scanf() 时你输入的所有字符全部读取一遍,直至结束。“

追问

那么~符号是什么意思?

追答

在这个地方,~符号的用法很特殊,它只与while()语句、scanf()两个函数合用才起这们的作用:就是”把你从键盘上输入的字符(包括空格和回车)全部取一遍,并且程序自动回来取,直到取完为止“的意思。——离开这两个语句的固定搭配用法,这个~符号就没有这种意义了。

追问

那a^=b是什么意思丫。。

追答

a^=b与a=a^b等效。

^是逻辑计算符号,是”异或”,a^b的计算方法是(举例:a=3,b=5):
先把他们转化为二进制数,a=3=101,b=5=111
再把它们相同位上的数字(1与0)进行比较,根据“异或”运算规则,相同的数字结果为0,不同的数字时结果为1:先看101与111的左边第一位均为1,那么结果为0;再看中间一位,一个是0一个是1,那么结果是1;最右边一位都是1,那么结果又是0。把三个结果写在一起就是“010”(也就是2)即结果是3^5=2。因为a=a^b,把最终结果赋值给a,a=2(二进制是010)。
这就是这句a^=b;的作用。
下面的好多b^=a; a^=b;等等,你自己看能不能看懂?方法跟上面一样,不懂再留言。

追问

那最后为什么是交换了呢?这样做不是已经改变原数了么?

追答

前面叙述有点错误:5的二进制数不是111,而是101。
当a=3=011(二进制)、b=5=101(二进制)时,a^b=3^5=011^101=110=6(而不是昨天所说的010=2)。
其实,你说的对,执行完毕这三句:
a^=b;
b^=a;
a^=b;
a与b的值就交换了。
因为(假设a=3,b=5):

执行完第一句后:a=a^b=3^5=011^101=110=6
执行完第二句后:b=b^a=5^6=101^110=011=3
执行完第三句后:a=a^b=6^3=110^011=101=5
最后的结果是:a=5,b=3。
但是这三句是在一个if语句中的一部分 :
if(a>b){
a^=b;
b^=a;
a^=b;
}
if语句的意思是只有当a>b时,才执行这三句交换语句!如果a不大于b,就不会执行这三句了,也就是不会交换了。
现在你有点头绪了吧?当a大于b时,就把a和b交换,如果a不大于b就不交换了。执行完这个if语句后,a总是不会小于b的。确保了a与b按照从小到大的排序。

程序的后面还有两个类似的结构,其实作用也是一样的:
if(a>c){
a^=c;
c^=a;
a^=c;
}
上面这一个if语句完成了a与c从小到大的排序。
if(b>c){
b^=c;
c^=b;
b^=c;
}
而上面这一个if语句完成了b与c从小到大的排序。
整个三个if语句完成的是abc三个字符从小到大的排序。
不管你输入的三个字符的顺序是235、253、325、352、523还是532,最后都是a=2,b=3,c=5,所以打印出来的是一样的,即:
2 3 5。

这个程序的作用就是“输入任意三个字符,把这三个字符按照从小到大的顺序打印出来的”的功能。

追问

谢谢啦,你回答的真的很好。

追答

谢谢你的评价。祝你学习进步!

本回答被提问者和网友采纳
相似回答