c语言的细节问题?

Python012

c语言的细节问题?,第1张

1、在对scanf()函数传参的时候,数值和字符类型变量前加上&,而字符串变量前不用

原因:对于数值和字符串类型变量而言,变量名不代表内存地址,需要在变量名前加上地址符&。

而字符串其变量名代表内存地址,所以不需要。

2、C语言中的数据类型的分类:基本数据类型:字符型、整型、单精度、双精度浮点型、

中级数据类型:数组、指针、结构体、联合体、枚举。

3、float和double的区别:float可以精确到的数值为小数点后7位,而double可以精确到的数值为小数点后15位。

4、&表示按位与,&&表示逻辑与。|按位或,||逻辑或。^位异或。

5、其中10的二进制:0000 1010

则-10的二进制:a:对10取反:1111 0101

b:对取反后的值加1:1111 0110

所以-10的二进制为:1111 0110

显而易见,得出

结论一:这是一种非常危险的编程习惯。

结论二:这是一个非常有效的探索编译器的测试程序。

结论三:程序员实际中是不会写这样的程序的!

很显然,输出结果取决于编译器:

VC++6.0   和   VS2010

5   5   4

3   3   3

linux下gcc编译器

5   5   5

5   4   3

接下来,我们分组讨论:

第一:        printf("%d %d %d\n", i, ++i, ++i)

对VC++6.0和VS2010

显然,编译器识别了:++在前,要先进行++运算,再将运算结果输出,即输出i的值。

需要注意的是:

  它是从右往左,做一次++,i = 4作为一个输出结果压入栈;然后,再做一个++,  i = 5作为一个结果压入栈;这个特点非常明显。

先算第二个  ++i  ,得到4,存入栈

再计算第一个  ++i  ,得到5,存入栈

最后,先输出5,再是依次弹栈取值5 ,4,实现输出:5   5   4

一句话:先++,多个++,一个一个来。一个++,一次入栈,一个结果。

对Linux下的gcc

显然,编译器识别了:++在前,要先对变量进行++运算,在将运算结果输出。

需要注意的是:

它也是从右往左,直接就是先进行  两次  ++  运算,因为是自增以后在入栈,所以,i = 5,然后,将2个5依次压入栈,这是它的特点。

最后,先输出5,再是依次弹栈取值5 ,5,实现输出:5   5   5

一句话:先++,多个++,一次性搞完全部++。

第二:    printf("%d %d %d\n", j, j++, j++)

对VC++6.0和VS2010

显然,编译器识别了:++在后,没有需要在printf前,进行运算。所以,先全部输出y,再一个一个++运算。

                     一句话:printf所有y,再搞完所有的++。

对Linux下的gcc

显然,编译器识别了:++在后,没有需要在printf前,进行运算。所以,从右到左,一个一个来。每个都是先 printf 输出 y ,再++运算。

先将最后一个y值, 3,入栈,再进行++,y = 4;

再将第二个y值, 4,入栈,在进行++,y = 5;

最后,先输出5,再是依次弹栈取值4,3,实现输出:5   4   3

一句话:一个一个来,每个都是先printf,再++

很好,分析完毕,重复我们得出的结论

结论一:这是一种非常危险的编程习惯。

结论二:这是一个非常有效的探索编译器的测试程序。

结论三:程序员实际中是不会写这样的程序的!

这是因为你在输入a后,后面的回车还放在键盘的输入缓冲区里,当后面需要输入,就可能会从缓冲区里取出回车给它。第一个程序,由于最后的格式化输入是数字,回车不符合要求,被抛弃。第二个程序,最后的格式化输入是字符,字符可以是回车,TAB跳格等等,所以回车就给ch了。输入之前清空缓冲区就不会这样了

#include "stdio.h"

#include "conio.h"

main()

{

int a,b=1,c

char ch='y'

while (ch=='y')

{

scanf("%d",&a)

if (a%2==0)printf("%d is a oshu\n",a)

if (a%2==1)printf("%d is a jishu\n",a)

printf("go on? y or n?\n")

fflush(stdin) // 清空缓冲区

scanf("%c",&ch)

}

getch()

}