啊哈磊_编程从这里起步

标题: 关系运算符的问题 [打印本页]

作者: 飞翔の蓝天    时间: 2014-3-15 21:50
标题: 关系运算符的问题
为什么当x=-3时,0<=x<=2为"真"
为什么当y=45.3219时,y==45.3219为"假"

作者: 李掌柜    时间: 2014-3-15 21:50
C语言里面逻辑值是O的为假,  其他的都为真
既“非0即真”。
我们可以写一个小程序证明,例如:
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.     int true_val,false_val;
  5.         int x=-3;
  6.         int y=45.3219;
  7.         true_val=0<=x<=2;       
  8.         printf("\"0<=x<=2\"   真=%d\n",true_val);
  9.         false_val=y==45.3219;
  10.         printf("\"y==45.3219\"假=%d\n",false_val);//看到值木有,非0既真
  11.        
  12.         return 0;
  13.        
  14. }
复制代码


abc37.png (2.77 KB, 下载次数: 4)

abc37.png

作者: rosynirvana    时间: 2014-3-15 22:49
我猜你用了float

float y=45.3219;
那么y == 45.3219就是假

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.         float y=45.3219;
  6.     printf("%d\n", y == 45.3219);
  7.         system("pause");
  8.         return 0;
  9. }
复制代码


字面值的小数类型为double
或者说y == 45.3219右边的45.3219是double

double和float的精度不同所以不想等,所以是0

新人请切记不要用float
作者: rosynirvana    时间: 2014-3-15 22:51
噢还有第一个问题

0<=x<=2

处理次序是 (0 <= x)  <= 2
0 <= x的结果会被转化成0(假)或者1(真)
0 <= 2 或者 1<= 2都是真
所以是1
作者: 飞翔の蓝天    时间: 2014-3-16 10:20
李掌柜 发表于 2014-3-15 22:34
C语言里面逻辑值是O的为假,  其他的都为真
既“非0即真”。
我们可以写一个小程序证明,例如:

我就是想知道为什么 当y=45.3219时,y==45.3219为"假"
作者: 飞翔の蓝天    时间: 2014-3-16 10:21
rosynirvana 发表于 2014-3-15 22:49
我猜你用了float

float y=45.3219;

没有用float和double,只是书上的一个例子而已,当y=45.3219时,y==45.3219为"假",why?
作者: rosynirvana    时间: 2014-3-16 12:10
飞翔の蓝天 发表于 2014-3-16 10:21
没有用float和double,只是书上的一个例子而已,当y=45.3219时,y==45.3219为"假",why?

只能说不要看这本书了
作者: 李掌柜    时间: 2014-3-16 12:19
飞翔の蓝天 发表于 2014-3-16 10:20
我就是想知道为什么 当y=45.3219时,y==45.3219为"假"

额~~系统返回0就是假,返回1就是真啊~~那个小程序的返回值你木有看哎~~
作者: 李掌柜    时间: 2014-3-16 12:56
飞翔の蓝天 发表于 2014-3-16 10:21
没有用float和double,只是书上的一个例子而已,当y=45.3219时,y==45.3219为"假",why?

这个例子是要告诉你逻辑判断,系统返回给你的值判断真假,返回0就是假,非0就是真
比如我们一个while想要一直循环可以用while(1)  ,while(50)这样的表达式,
现在把昨天那个小程序改下,更直观一点:
  1. #include<stdio.h>
  2. int main(void)
  3. {
  4.     int val;
  5.         int x=-3;
  6.         int y=45.3219;
  7.         val=0<=x<=2;       
  8.         printf("\"0<=x<=2\"   的系统返回值是:%d\n",val);
  9.         val=y==45.3219;
  10.         printf("\"y==45.3219\"的系统返回值是:%d\n",val);//看到值木有,非0既真
  11.        
  12.         return 0;
  13.        
  14. }
复制代码
我们可以让系统自己告诉我们,
0<=x<=2;  和 y==45.3219;
的逻辑值是0,还是非0;
你也可以自己判断真假,
三楼的写的很清楚了~~
-3<2是真的
y==45.3219是假的是因为系统的默认是int 类型,



作者: rosynirvana    时间: 2014-3-16 13:31
李掌柜 发表于 2014-3-16 12:56
这个例子是要告诉你逻辑判断,系统返回给你的值判断真假,返回0就是假,非0就是真
比如我们一个while想要 ...

C中的变量没有默认类型……必须显式声明
作者: 李掌柜    时间: 2014-3-16 14:31
本帖最后由 李掌柜 于 2014-3-16 14:40 编辑
rosynirvana 发表于 2014-3-16 13:31
C中的变量没有默认类型……必须显式声明

难到你写入口的时候不是用int main()默认的int 类型???人才
作者: 超神级    时间: 2014-3-16 16:22
楼主可以把哪本书扔了。
作者: rosynirvana    时间: 2014-3-16 22:36
李掌柜 发表于 2014-3-16 14:31
难到你写入口的时候不是用int main()默认的int 类型???人才

说的是变量类型,不是函数返回值类型
要说利用返回值默认为int那也是  main() {},而不是int main(){}
你是不懂”默认“还是不懂”变量“?
作者: 李掌柜    时间: 2014-3-16 23:26
超神级 发表于 2014-3-16 16:22
楼主可以把哪本书扔了。

我晕死,这个例子可是《C primer plus》里面的一个例子~~
作者: 李掌柜    时间: 2014-3-16 23:30
rosynirvana 发表于 2014-3-16 22:36
说的是变量类型,不是函数返回值类型
要说利用返回值默认为int那也是  main() {},而不是int main(){}
...


  1. #include<stdio.h>
  2. main()
  3. {
  4.         printf("ni hao!\n");
  5. }
复制代码

字符“ni hao”可有申明???类型???
作者: 李掌柜    时间: 2014-3-16 23:46
超神级 发表于 2014-3-16 16:22
楼主可以把哪本书扔了。

如果著作《C primer plus》这本书都要扔掉,真不知道那本才是C语言的入门书了

55.png (168.38 KB, 下载次数: 33)

55.png

作者: rosynirvana    时间: 2014-3-17 00:07
李掌柜 发表于 2014-3-16 23:30
字符“ni hao”可有申明???类型???

"ni hao"有类型,是char*
它是字符串,不是字符
它是字面值不是变量,所以不需要声明
所以你真不知道什么叫变量?
作者: 超神级    时间: 2014-3-17 12:47
李掌柜 发表于 2014-3-16 23:30
字符“ni hao”可有申明???类型???


main()
{
      
}
作者: rosynirvana    时间: 2014-3-17 15:06
超神级 发表于 2014-3-17 12:47
main()
{
      

这是啥意思……

准确来说main(){}是一个定义……
符合C90标准
作者: 李掌柜    时间: 2014-3-17 20:33
rosynirvana 发表于 2014-3-17 00:07
"ni hao"有类型,是char*
它是字符串,不是字符
它是字面值不是变量,所以不需要声明

问题是这里并没有申明char*呀?


作者: 李掌柜    时间: 2014-3-17 20:33
rosynirvana 发表于 2014-3-17 00:07
"ni hao"有类型,是char*
它是字符串,不是字符
它是字面值不是变量,所以不需要声明

问题是这里并没有申明char*呀?


作者: 超神级    时间: 2014-3-17 20:36
李掌柜 发表于 2014-3-16 23:30
字符“ni hao”可有申明???类型???

好吧!给你谈点我自己的对于这些问题的看
K&R 写法~! 打印的字符ni hao就是一种数据类型,, 因为在这里并没有申明它,,
函数->结构体->类。
进化体系.
作者: 超神级    时间: 2014-3-17 20:38
rosynirvana 发表于 2014-3-17 15:06
这是啥意思……

准确来说main(){}是一个定义……

其实我也是不知道.....
作者: 李掌柜    时间: 2014-3-17 20:39
超神级 发表于 2014-3-17 20:36
好吧!给你谈点我自己的对于这些问题的看
K&R 写法~! 打印的字符ni hao就是一种数据类型,, 因为在这 ...

v那它是以怎么的形式保存”ni hao“的?

作者: 超神级    时间: 2014-3-17 20:47
李掌柜 发表于 2014-3-17 20:39
v那它是以怎么的形式保存”ni hao“的?

printf();这个函数是怎么包装我也是不会!但是里面确实包含了很多东西.加减乘除运算,字符串打印,转义字符,等等的实现!所以很多人说printf();运算效率并不好.
作者: 李掌柜    时间: 2014-3-17 20:56
超神级 发表于 2014-3-17 20:47
printf();这个函数是怎么包装我也是不会!但是里面确实包含了很多东西.加减乘除运算,字符串打印,转义字 ...

这里说的是类型呢!不管是字符还是字符串它保存的类型都是整形,也就是int;
打印出的ni hao并没有申明是字符还是字符串~~
你可以去看《C primer plus》英文版,第55页

char.png (196.3 KB, 下载次数: 37)

char.png

作者: 超神级    时间: 2014-3-17 21:27
李掌柜 发表于 2014-3-17 20:56
这里说的是类型呢!不管是字符还是字符串它保存的类型都是整形,也就是int;
打印出的ni hao并没 ...

我不知道printf();的实现所以无法说出它的类型是什么...!
看着还是有点道理的不过char的升级版是int ,或者就像int 的升级版是long一样.
所以有很多东西不是很好说!如果个真是要说"nihao"的类型的话我说点不靠谱的话
char 是个类型知道它一般包含了什么吗。char 包含了2的八次方的图形图像.。里面有20个英文字母和1o个阿拉伯数字等;所以char是字符形.(这句话不标准,因为这些问题涉及到编码)。但是如果想知道他到底是啥类型的话可以查看他的最后一个字符.或者计算他的长度strlen.
作者: 李掌柜    时间: 2014-3-17 21:34
超神级 发表于 2014-3-17 21:27
我不知道printf();的实现所以无法说出它的类型是什么...!
看着还是有点道理的不过char的升级版是int , ...

好像也是~~类型什么的~~什么的~~??
其实我觉得写出来的代码能按自己所想的那样编译出来达到现实效果就行了~~
理论什么的一大堆,写不出东西来也是白达~~

作者: 超神级    时间: 2014-3-17 21:49
李掌柜 发表于 2014-3-17 21:34
好像也是~~类型什么的~~什么的~~??
其实我觉得写出来的代码能按自己所想的那样编译出来达到现实效果 ...

嗯!是的.编程的最高思想就是自的的思维转化为电脑的思维来写程序.
作者: rosynirvana    时间: 2014-3-17 23:50
李掌柜 发表于 2014-3-17 20:33
问题是这里并没有申明char*呀?

变量要声明
字面值不用
所以我一直强调变量
作者: rosynirvana    时间: 2014-3-17 23:51
超神级 发表于 2014-3-17 20:36
好吧!给你谈点我自己的对于这些问题的看
K&R 写法~! 打印的字符ni hao就是一种数据类型,, 因为在这 ...

函数+结构体->类 还差不多……
作者: rosynirvana    时间: 2014-3-17 23:54
李掌柜 发表于 2014-3-17 20:39
v那它是以怎么的形式保存”ni hao“的?

编译器把"ni hao"放在静态区
静态区具体是什么东西由编译器和操作系统决定
类型或者语义上等同于char*
作者: rosynirvana    时间: 2014-3-17 23:56
超神级 发表于 2014-3-17 20:47
printf();这个函数是怎么包装我也是不会!但是里面确实包含了很多东西.加减乘除运算,字符串打印,转义字 ...

这又关printf什么事了?
printf的实现在K&R第七章就有……
作者: 超神级    时间: 2014-3-18 05:08
rosynirvana 发表于 2014-3-17 23:51
函数+结构体->类 还差不多……

有道理。。。
作者: 超神级    时间: 2014-3-18 05:22
本帖最后由 超神级 于 2014-3-18 07:21 编辑
rosynirvana 发表于 2014-3-17 23:56
这又关printf什么事了?
printf的实现在K&R第七章就有……

感觉讲的不够深入。掌柜非要问我printf(“nihao”);“nihao”是啥类型的。
可是我不知道printf'函数的具体实现。printf也算是某种意义上的传参。
1,传给实现的是什么东西/!(上面讨论的问题重点)
2,实现接的是什么类型或者说接的是什么东西!(类型应该是匹配的)

作者: rosynirvana    时间: 2014-3-18 16:57
超神级 发表于 2014-3-18 05:22
感觉讲的不够深入。掌柜非要问我printf(“nihao”);“nihao”是啥类型的。
可是我不知道printf'函数 ...

printf的原型?是要说这个吧?
int printf(const char*, ...)
第一个参数是一个char*,后面参数数目不定

这个随便标准或者手册上查一下就有……

至于"nihao"的类型,在标准文本上叫String literal(字符串字面值),在语义上是char*
编译器处理的时候把字符串放在静态区,然后所有使用的地方当作char*

不过这和最初的问题有什么关系么
最初的问题是C里面用个变量要声明,没有默认类型这种玩意儿么
作者: 超神级    时间: 2014-3-18 21:47
rosynirvana 发表于 2014-3-18 16:57
printf的原型?是要说这个吧?
int printf(const char*, ...)
第一个参数是一个char*,后面参数数目不 ...

额,表示理解






欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) Powered by Discuz! X3.2