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]

 

 

 

 

 

转载于:https://www.cnblogs.com/mind-virtual/archive/2011/03/12/3365748.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值