原因:对于数值和字符串类型变量而言,变量名不代表内存地址,需要在变量名前加上地址符&。
而字符串其变量名代表内存地址,所以不需要。
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()
}