c语言很多让我无语的地方
声明本文所有代码 均在gcc测试通过
1枚举变量
解决Hanoi塔时候遇到的问题:
前用c++写的代码:
#include<iostream>
using namespace std;
enum tower{X='A',Y='B',Z='C'};
void Move(int n,tower x,tower y)
{
cout<<n<<" "<<char(x)<<" "<<char(y)<<endl;
}
void Hanio(int n,tower x,tower y,tower z)
{
if(n)
{
Hanio(n-1,x,z,y);
Move(n,x,y);
Hanio(n-1,z,y,x);
}
}
int main()
{
int n;
cin>>n;
Hanio(n,X,Y,Z);
return 0;
}
accepted
因为最近重新看c故用c语言重写:
#include<stdio.h>
enum tower {x='A',y,z};
void Hanoi(int n, tower x, tower y,tower z)
{
if(n)
{
Hanoi(n-1,x,z,y);
printf("%d %c %c/n",n,x,y);
Hanoi(n-1,z,y,x);
}
}
int main()
{
int n;
scanf("%d",&n);
Hanoi(n,x,y,z);
return 0;
}
本地编译通过不了
将void Hanoi(int n, tower x, tower y,tower z)改为 void Hanoi(int n, enum tower x, enum tower y,enum tower z)变成accepted
正在我苦四冥想为什么的时候,我的同学告诉我在网上看到在c++中enum可以省去,我顿时无语,在心里把c++骂了好几万遍!
2。有关字符串常量问题:
有一天一个看到一行代码:
“xyz”+1;
我当时就想这一定是脑残的人才能够写出来的代码,不知道的还真不理解,“zyx”代表什么意思呢?其实就是指向该字符串的指针,所以“xyz”+1指向y。所以我们也就可以推断出“zyz”[2]是z字符了。只是平时没有人这么写,如果真是真没写出来的代码,一定被称为脑残。
如果你想把一个数字转换为16进制我想这行代码对你一定有用:putchar("0123456789ABCDEF"[value%16]);
3。有关数组:
char *p="abcdef";
char p[]="abcdef"
这2行代码有什么本质区别,我的个老爹,不是一个意思么?
其实第一条语句*p是一个指针,存放的是指向一个字符数组的首地址,所以第一句话是首先创建一个“abcdef”字符串常量,然后字符串的首地址赋值给*p;
而第二条语句就是一个数组,“abcdef”是一个字符序列{‘a’,'b','c','d','e','f'}的简写
我创建一个数组:int a[100],假设已经初始化完成了,现在我输出a[10],printf("%d",a[10]);但是如果我输出printf("%d",10[a]);你又要说我脑残了,但是我告诉你,他是正确的,不信你就上机试试看。原因是在与c语言中的数组下表操符[],或者说c语言的编译器的解释原理吧,a[10]=*(a+10),10[a]=*(a+10);
如果我定义一个指针int *p;p=a[11],我printf("%d",p[-1]);得到的也是输出a[10];原理同上p[-1]=*(p-1),而p指向的是a[11],所以输出的也是a[10]