社区
C语言
帖子详情
请问一个关于指针自增自减的问题
musictornado
2002-10-03 09:09:07
请看下面的程序:
void main()
{typedef strct {int x,int y} number[]={{2,3},{4,5},{6,7}};
number *p=(number+1);
printf("%d",++p-->x);
printf("%d",p++-->x);
}
...全文
139
21
打赏
收藏
请问一个关于指针自增自减的问题
请看下面的程序: void main() {typedef strct {int x,int y} number[]={{2,3},{4,5},{6,7}}; number *p=(number+1); printf("%d",++p-->x); printf("%d",p++-->x); }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wangchanglu
2002-10-04
打赏
举报
回复
你太马虎了吧 以后不要了 那不是浪费大家的时间吗
musictornado
2002-10-04
打赏
举报
回复
一年,有什么问题吗?
请看我的题好吗?希望支持!!!
Aofa_lee
2002-10-04
打赏
举报
回复
你学编程学了多旧啊?
musictornado
2002-10-04
打赏
举报
回复
up
musictornado
2002-10-04
打赏
举报
回复
up
musictornado
2002-10-04
打赏
举报
回复
sorry,前一题有一点错误,请看下面的另一题,这是99年的初程试题:
#include <stdio.h>
main()
{ struct num{ int x; int y;}
sa[] = {{2, 32}, {8, 16}, {4, 48};
struct num *p = sa+1;
int x;
x = p->y / sa[0].x * ++p->x;
printf(″x = %d p->x = %d\n″, x, p->x);
}
程序1.1的输出结果是____
xiaoluoli
2002-10-04
打赏
举报
回复
void main()
{typedef strct {int x,int y} number[]={{2,3},{4,5},{6,7}};
//typedef struct {int x,int y} number[]={{2,3},{4,5},{6,7}};
//这里定义了结构提数组并赋了初值,number 是一个数组名。
number *p=(number+1);
//定义了一个结构提数组p,并把number+1赋给p
printf("%d",++p-->x);
printf("%d",p++-->x);
}
stone112979
2002-10-04
打赏
举报
回复
up
stonejin
2002-10-04
打赏
举报
回复
我想也是你打错了,
typedef struct {int x,int y} Number;
sonwman
2002-10-04
打赏
举报
回复
程序的功能我看不出来,但我可以肯定P的值没有变化。
指针有它的变化规则。
caitou123
2002-10-04
打赏
举报
回复
哦,打错了,应是这样:
typedef struct {int x;
int y;} Number ;
caitou123
2002-10-04
打赏
举报
回复
typedef strct {int x,int y} number[]={{2,3},{4,5},{6,7}};
what's this?
就是错误,要用的话只能这样:
typedef strct {int x,int y} Number;
Number number[]={{2,3},{4,5},{6,7}};
Number *p=number+1;
...
输出是一样的,都是6。
lw_yx
2002-10-03
打赏
举报
回复
本来就难学了,还非得往牛角里钻,何苦!
lw_yx
2002-10-03
打赏
举报
回复
不要写些莫名的程序,自己跟自己过不去?
Zark
2002-10-03
打赏
举报
回复
number的用法是可以的,number 是变量名,结构名是匿名的。
number[]中存放着三个结构体。
p指向第二个即{4,5}
(++p)->x; p指向第三个,所以是6
p++->x, p仍指向第三个,所以还是6,但做完后,p指向第四个结构体,其值就没有什么意义了。
WuYL7812
2002-10-03
打赏
举报
回复
不应该这样浪费别人的时间。
写这些代码的人有病。
Keanu_Rocky
2002-10-03
打赏
举报
回复
typedef strct {int x,int y} number[]={{2,3},{4,5},{6,7}};
what's this?
我个人觉得,这样做是不是有错误啊?
number是变量名还是类型名??
hehe214
2002-10-03
打赏
举报
回复
看到什么了?
waterstony
2002-10-03
打赏
举报
回复
我看到了。
bigant888
2002-10-03
打赏
举报
回复
看不明白,关注~~
加载更多回复(1)
C语言中
指针
自增
自减
运算常见错误分析.pdf
C语言中
指针
自增
自减
运算常见错误分析
C语言
自增
自减
运算的区别详解及实例
主要介绍了C语言中的++a和a++的区别详解及实例的相关资料,需要的朋友可以参考下
220个经典C语言源码
220个经典C语言源码 从简单到难的220来个经典C程序 第一部分 基础篇 001 第
一个
C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符的输出 006 显示变量所占字节数 007
自增
/
自减
运算 008 数列求和 009 乘法口诀表 010 猜数字游戏 011 模拟ATM(自动柜员机)界面 012 用一维数组统计学生成绩 013 用二维数组实现矩阵转置 014 求解二维数组的最大/最小元素 015 利用数组求前n个质数 016 编制万年历 017 对数组元素排序 018 任意进制数的转换 019 判断回文数 020 求数组前n元素之和 021 求解钢材切割的最佳订单 022 通过
指针
比较整数大小 023 指向数组的
指针
024 寻找指定元素的
指针
025 寻找相同元素的
指针
026 阿拉伯数字转换为罗马数字 027 字符替换 028 从键盘读入实数 029 字符行排版 030 字符排列 031 判断字符串是否回文 032 通讯录的输入输出 033 扑克牌的结构表示 034 用“结构”统计学生成绩 035 报数游戏 036 模拟社会关系 037 统计文件的字符数 038 同时显示两个文件的内容 039 简单的文本编辑器 040 文件的字数统计程序 041 学生成绩管理程序 。。。。 。。。。
广东专升本计算机统考c语言
广东,升本,计算机,c,统考,
指针
,数组,顺序结构、循环结构、选择结构、c语言特点、c语言第四版、数据类型、算术符、
自增
自减
、函数、全局变量、局部变量
Google C++ 编码规范
为PDF文件增加了目录,便于快速浏览。 摘录一些不知道以及没有做到的: 1、防止多重包含(头文件的形式不能完美做到) 所有头文件都应该使用#define防止头文件被多重包含(multiple inclusion),命名格式当是:
_
_
_H_ 为保证唯一性,头文件的命名应基于其所在项目源代码树的全路径。例如,项目foo中的头文件foo/src/bar/baz.h按如下方式保护: #ifndef FOO_BAR_BAZ_H_ #define FOO_BAR_BAZ_H_ ... #endif // FOO_BAR_BAZ_H_ 2、能依赖声明就不要依赖定义 使用前置声明(forward declarations)尽量减少.h文件中#include的数量。 当
一个
头文件被包含的同时也引入了一项新的依赖(dependency),只要该头文件被修改,代码就要重新编译。如果你的头文件包含了其他头文件,这些头文件的任何改变也将导致那些包含了你的头文件的代码重新编译。因此,我们宁可尽量少包含头文件,尤其是那些包含在其他头文件中的。 使用前置声明可以显著减少需要包含的头文件数量。举例说明:头文件中用到类File,但不需要访问File的声明,则头文件中只需前置声明class File;无需#include "file/base/file.h"。 在头文件如何做到使用类Foo而无需访问类的定义? 1) 将数据成员类型声明为Foo *或Foo &; 2) 参数、返回值类型为Foo的函数只是声明(但不定义实现); 3) 静态数据成员的类型可以被声明为Foo,因为静态数据成员的定义在类定义之外。 另一方面,如果你的类是Foo的子类,或者含有类型为Foo的非静态数据成员,则必须为之包含头文件。 3、为什么要使用内联函数,又如何改进性能? 定义(Definition):当函数被声明为内联函数之后,编译器可能会将其内联展开,无需按通常的函数调用机制调用内联函数。 重要的是,虚函数和递归函数即使被声明为内联的也不一定就是内联函数。通常,递归函数不应该被声明为内联的(译者注:递归调用堆栈的展开并不像循环那么简单,比如递归层数在编译时可能是未知的,大多数编译器都不支持内联递归函数)。析构函数内联的主要原因是其定义在类的定义中,为了方便抑或是对其行为给出文档。 4. 函数参数顺序(Function Parameter Ordering) 定义函数时,参数顺序为:输入参数在前,输出参数在后。 C/C++ 函数参数分为输入参数和输出参数两种,有时输入参数也会输出(译者注:值被修改时)。输入参数一般传值或常数引用(const references),输出参数或输入/输出参数为非常数
指针
(non-const pointers)。对参数排序时,将所有输入参数置于输出参数之前。不要仅仅因为是新添加的参数,就将其置于最后,而应该依然置于输出参数之前。 5、头文件定义顺序 将包含次序标准化可增强可读性、避免隐藏依赖(hidden dependencies,译者注:隐藏依赖主要是指包含的文件中编译时),次序如下:对应该CPP的头文件、C库、C++库、其他库的.h、项目内的.h。 相同目录下头文件按字母序是不错的选择。 1. 命名空间(Namespaces) 在.cc文件中,提倡使用不具名的命名空间(unnamed namespaces,译者注:不具名的命名空间就像不具名的类一样,似乎被介绍的很少:-()。使用具名命名空间时,其名称可基于项目或路径名称,不要使用using指示符。 定义:命名空间将全局作用域细分为不同的、具名的作用域,可有效防止全局作用域的命名冲突。 优点:命名空间提供了(可嵌套)命名轴线(name axis,译者注:将命名分割在不同命名空间内),当然,类也提供了(可嵌套)的命名轴线(译者注:将命名分割在不同类的作用域内)。 举例来说,两个不同项目的全局作用域都有
一个
类Foo,这样在编译或运行时造成冲突。如果每个项目将代码置于不同命名空间中,project1::Foo和project2::Foo作为不同符号自然不会冲突。 缺点:命名空间具有迷惑性,因为它们和类一样提供了额外的(可嵌套的)命名轴线。在头文件中使用不具名的空间容易违背C++的唯一定义原则(One Definition Rule (ODR))。 1) 不具名命名空间(Unnamed Namespaces) 在.cc文件中,允许甚至提倡使用不具名命名空间,以避免运行时的命名冲突: namespace { // .cc 文件中 // 命名空间的内容无需缩进 enum { UNUSED, EOF, ERROR }; // 经常使用的符号 bool AtEof() { return pos_ == EOF; } // 使用本命名空间内的符号EOF } // namespace 然而,与特定类关联的文件作用域声明在该类中被声明为类型、静态数据成员或静态成员函数(什么意思?),而不是不具名命名空间的成员。像上文展示的那样,不具名命名空间结束时用注释// namespace标识。 2、函数重载 结论:如果你想重载
一个
函数,考虑让函数名包含参数信息,例如,使用AppendString()、AppendInt()而不是Append()。 3. 缺省参数(Default Arguments) 禁止使用缺省函数参数。 优点:经常用到
一个
函数带有大量缺省值,偶尔会重写一下这些值,缺省参数为很少涉及的例外情况提供了少定义一些函数的方便。 缺点:大家经常会通过查看现有代码确定如何使用API,缺省参数使得复制粘贴以前的代码难以呈现所有参数,当缺省参数不适用于新代码时可能导致重大
问题
。 结论:所有参数必须明确指定,强制程序员考虑API和传入的各参数值,避免使用可能不为程序员所知的缺省参数。 8. 类型转换(Casting) 使用static_cast<>()等C++的类型转换,不要使用int y = (int)x或int y = int(x);。 定义:C++引入了有别于C的不同类型的类型转换操作。 优点:C语言的类型转换
问题
在于操作比较含糊:有时是在做强制转换(如(int)3.5),有时是在做类型转换(如(int)"hello")。另外,C++的类型转换查找更容易、更醒目。 缺点:语法比较恶心(nasty)。 结论:使用C++风格而不要使用C风格类型转换。 1) static_cast:和C风格转换相似可做值的强制转换,或
指针
的父类到子类的明确的向上转换; 2) const_cast:移除const属性; 3) reinterpret_cast:
指针
类型和整型或其他
指针
间不安全的相互转换,仅在你对所做一切了然于心时使用; 4) dynamic_cast:除测试外不要使用,除单元测试外,如果你需要在运行时确定类型信息,说明设计有缺陷(参考RTTI)。 10. 前置
自增
和
自减
(Preincrement and Predecrement) 对于迭代器和其他模板对象使用前缀形式(++i)的
自增
、
自减
运算符。 定义:对于变量在
自增
(++i或i++)或
自减
(--i或i--)后表达式的值又没有没用到的情况下,需要确定到底是使用前置还是后置的
自增
自减
。 优点:不考虑返回值的话,前置
自增
(++i)通常要比后置
自增
(i++)效率更高,因为后置的
自增
自减
需要对表达式的值i进行一次拷贝,如果i是迭代器或其他非数值类型,拷贝的代价是比较大的。既然两种
自增
方式动作一样(译者注,不考虑表达式的值,相信你知道我在说什么),为什么不直接使用前置
自增
呢? 缺点:C语言中,当表达式的值没有使用时,传统的做法是使用后置
自增
,特别是在for循环中,有些人觉得后置
自增
更加易懂,因为这很像自然语言,主语(i)在谓语动词(++)前。 结论:对简单数值(非对象)来说,两种都无所谓,对迭代器和模板类型来说,要使用前置
自增
(
自减
)。 16. sizeof(sizeof) 尽可能用sizeof(varname)代替sizeof(type)。 使用sizeof(varname)是因为当变量类型改变时代码自动同步,有些情况下sizeof(type)或许有意义,还是要尽量避免,如果变量类型改变的话不能同步。 8. TODO注释(TODO Comments) 对那些临时的、短期的解决方案,或已经够好但并不完美的代码使用TODO注释。 这样的注释要使用全大写的字符串TODO,后面括号(parentheses)里加上你的大名、邮件地址等,还可以加上冒号(colon):目的是可以根据统一的TODO格式进行查找: // TODO(kl@gmail.com): Use a "*" here for concatenation operator. // TODO(Zeke) change this to use relations. 如果加上是为了在“将来某一天做某事”,可以加上
一个
特定的时间("Fix by November 2005")或事件("Remove this code when all clients can handle XML responses.")。 TODO很不错,有时候,注释确实是为了标记一些未完成的或完成的不尽如人意的地方,这样一搜索,就知道还有哪些活要干,日志都省了。
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章