C语言算数el表达式double转int int t=5+1/2; printf(“%d\n,t”);

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
C语言指针问题
下面代码为什么第二个数字是5呢?
int a[5] = {1,2,3,4,5};
int *p = (int *)(&a+1);
NSLog(@"%d,%d", *(a+1), *(p-1));
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
&a得出来的是指向数组的指针,所以&a+1其实是以数组的长度为单位来移动的。如果你只是想要得到数组的第二个元素的话,那么就用*(&a[0]+1),因为&a[0]的数据类型是int*。画个图先:
假设有以下数组
int a[5] = {1,2,3,4,5};
int *x = &a+1;
虽然上面的程序可以编译通过,但是,编译器会出警告,因为x和a的类型不匹配,要想把警告去掉,有两种方法
1、通过强制类型转换
int *x = (int *)(&a+1);
print("%d\n",*(x-1));
2、为它寻找合适的类型 &a的类型是int (*)[5]
int (*x)[5] = &a+1;
printf("%d\n",**(x-1));
这里就牵涉到了如何写出适当的数据类型,这在赋值和参数传递中很重要!
所以,首先我得总结一下a,&a和&a[0]这三个数据的数据类型
a是数组名,是指向数组第一个元素的指针,毫无疑问,在这里,数组第一个元素的数据类型是int所以a的数据类型是就是int*。
&a是对一个一维数组取地址,得出来的是指向数组的指针(在这里是pointer to array of int), 也就是int(*)[5]。
&a[0]就很简单,首先a[0]得到的是一个整形数int,然后对它取地址,所以它的数据类型就是int*。
知道了数据类型,那么对指针运算看起来就清晰多了!
先看看通过强制类型转换的那部分代码,它会输出什么数字呢?
通过刚才对数据类型的总结可以知道,&a的数据类型是int (*)[5],所以&a+1其实是已经移动了5*sizeof(int)个字节了
现在指针是指到了数组最后一个元素的后一个元素(图1),也就是说,已经越界了!但是因为x的数据类型其实是int *
所以对于x-1,其实是向左移动了1*sizeof(int)个字节,也就是指向了最后一个元素,所以*(x-1)得出来的
值就是数组的最后一个元素:5
好了,现在再看第二部分,它又会输出什么数字呢?先不说答案,刚才也说了,在这里
x的数据类型是int (*)[5],是一个指向含有5个int元素的一维数组的指针,对它进行加减运算的话就会以
sizeof(int)*5个字节为单位进行移动,所以x-1其实是向左移动了sizeof(int)*5个字节,在我的机器上是移动了
20个字节,也就是回到了数组的第一个元素,所以得出来的答案就是:1
以上是一维数组的,下面我想说说二维数组的情况,有以下一段代码:
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
?? = // int (*b)[3] =
?? = a[0]; // int *c = a[0];
?? = a[0][0] // int d = a[0][0];
?? = &a; // int (*e)[3][3] = &a;
?? &a[0]; // int (*f)[3] = &a[0]
?? &a[0][0]; // int *g = &a[0][0]
还是先看看a,a[0],&a,&a[0],&a[0][0]这几者的数据类型:
注意上面加粗了的文字,数组名是指向数组第一个元素的指针!
a的数据类型是??int *?不是,这句加粗了的文字的核心就是第一个元素这五个字,
a的第一个元素不就是a[0][0]吗?严格来说,不是,a的第一个元素其实是a[0],那么a[0]的数据类型是什么呢?a[0]
是一个包含三个int元素的数组,所以a[0]的类型就和int t[3]中t的类型一样,是int*,既然第一个元素 的数据类型是
int*,那把这个二维数组看成一维数组的话,实际上它就是一个含有三个int*元素的
数组,也就是指针数组,所以a的数据类型就是int (*)[3]
再来看看&a,在一维数组的时候说了,对一个数组名取地址得出来的是指向数组的指针,所以&a的数据类型 就是int (*)[3][3]
&a[0]这个看上去有点蛋疼,但是在上上段文字中也说了,a[0]是一个包含三个int元素的数组,和int t[3]
中的t的数据类型一样,是int*,自然,&a[0]的数据类型就和&t的数据类型一样,也就是int (*)[3]
到这里,二维数组中关于数据类型就写得差不多了,既然知道了数据类型,那么运算起来就可以准确知道指针会移动到哪里!
看看下面这段代码:
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int (*x)[3] =
int *k = a[0];
int (*y)[3][3] = &a;
int (*q)[3] = &a[0];
int *z = &a[0][0];
printf("%d\n",(*(x+1))[0]);
printf("%d\n",*(k+1));
printf("%d\n",(*(*(y+1)))[0]);
printf("%d\n",(*(q+1))[0]);
printf("%d\n",*(z+1));
int *p = (int *)(y+1);
printf("%d\n",*(p-1));
x的数据类型是int (*)[3],所以,x+1实际上是移动了3*sizeof(int)个字节,如图所示:
k的数据类型是int *,所以,k+1实际上是移动了sizeof(int)个字节。
y的数据类型是int
(*)[3][3],所以y+1实际上是移动了3*3*sizeof(int)个字节,也就是到了数组最后一个
元素的后面的一个元素。如图所示:
q的数据类型是int (*)[3],所以,q+1实际上也是移动了3*sizeof(int)个字节。
z的数据类型是int *,所以z+1实际上是移动了sizeof(int)个字节。
所以对数组指针进行加减运算,最重要的是知道它的步长,而步长又是由数据类型决定的!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
一楼答主写的很好,做点扩展
指针的值是一个数组的地址int
* pa )[5];pa++;pa往后移动20个字节(5*4)
对比,数组中的元素是指针(int*)int
*pa[5];pa++;pa往后移动4个字节
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
不好意思翻老帖。无意间看到这个,因为以前做嵌入式编程,数组、指针是经常使用的,包括对指针变量直接赋值一个内存地址(这个在做正常的应用程序一般不会用到),以前也没有发现&arr和arr有什么区别。今天特意查了一下,原来这个要视编译器而定。有的编译器把数组和指针是分别对待的,对数组名取地址的意义是针对整个数组内存,有的编译器则把数组认为是指针的一个特定形式,这种情况指针跳一个就是一个数组元素的内存,而不存在整个数组内存这一说。
该答案已被忽略,原因:
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。用C语言编写程序,计算表达式1-1/2+1/3-1/4+1/5的结果. 在线等。_百度知道
用C语言编写程序,计算表达式1-1/2+1/3-1/4+1/5的结果. 在线等。
我有更好的答案
&&&i&=5;&&%f&&float&i,s,t;&&&&t=1;&&&&s=0; for(i=1;,s);i++)&{&&&& s+=t/i;&&&& t=-t;&&&&} printf(&quot#include&&stdio.h&int&main(){&nbsp
采纳率:73%
来自团队:
为您推荐:
其他类似问题
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C语言里main() {int i,t; t=1; i=2; while(i&=5) {t=t*i; i=i+1; } printf(“%d”,t); }_百度知道
C语言里main() {int i,t; t=1; i=2; while(i&=5) {t=t*i; i=i+1; } printf(“%d”,t); }
这条代码是要计算出1×2×3×4×5
这在书上看到的代码 请懂C语言的解释一下这几条代码的功能
本人刚学 呵呵
我有更好的答案
int i,这个%d是整数类型),t(就是说你要输出那个变量))都是一个字一个字敲出来的,如果觉得有用,望采纳。t = t*i,t;就是定义两个int类型的变量(int类型也就是整数类型)t =1;i=2;也就是给t和i这两个你定义好的变量赋值,每个变量都需先进行赋值(术语是:初始化)while这个函数是一个循环函数..这个就不解释了,printf这是个输出函数,(%d(说明你要输出的变量的类型,小括号里面的是你执行大括号里面语句的条件,也就是说只要i&=5,那么就执行大括号里面的语句。main()主函数,每个项目都必须要的东西,没有它,程序永远跑不起来
采纳率:33%
执行以下循环:对t进行赋值:当i&ltint i,t;t=1;i=2 初始化while语句:t=t*i;=5时
main() 主函数标志{int i,t; 定义两个变量t=1; i=2; 给变量赋初值while(i&=5) 循环条件,即当i小于5时就计算t=t*i; i=i+1;{t=t*i; i=i+1; } printf(“%d”,t); 输出最后结果}
/*表示主函数必须写,每个程序必然有且只有一个*/{int i,t;
/*定义整形变量i和t*/t=1;
/*给t赋值为1*/i=2;
/*给i赋值为2*/while(i&=5)
/*这是一个循环,i小于等于5时运行*/ {t=t*i;
/*t被赋值为t乘以I,注意:t被t乘以i取代了!*/i=i+1;
/*i被赋值为i+1,同样i被i+1取代了!*/} printf(“%d”,t); /*打印t的值*/}
main() {int i,t; t=1; i=2; while(i&=5) {t=t*i; i=i+1; //t=t*i表示 t*i的结果赋值给t 然后i+1 } printf(“%d”,t); }i
其他2条回答
为您推荐:
其他类似问题
printf的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C语言问题:编程求1!+2!+3!+4!+5!。_百度知道
C语言问题:编程求1!+2!+3!+4!+5!。
我有更好的答案求助知道网友
for(i = 1;i&
printf(&%d &; } printf(&,result);return 0;=5;i++) {
for(j=1;j&=i;j++)
sum*=j#include &%d&quot.h&int main(void){ int i,sum = 1,j,result=0,result);stdio
#include &stdio.h&int fact(int n)
int i,factn=1;
for(i=1;i&=n;i++)
factn=factn*i;}int main(){
int i,sum=0;
for(i=1;i&=5;I++)
sum=sum+fact(i);
printf(&sum=%d\n&,sum);
return 0;}
那个fact我们没学过
这个是自己定义的函数,你们没学过函数吗?
我懂了'就和int i 一样,对吗
fact是一个用户自定义的函数,输入参数是一个整数,fact()计算的结果是该整数的阶乘
真的,没骗你
void&&nbsp,t=1;&&&sum+=t;&&&&}&&&i++)&{&&&&&&&&t*=i;&for(i=1;&&main(){&&&&int&&nbsp#include&stdio.h&&sum=0;i&=5;&&nbsp,i;&&printf(&%d\n&;&&&nbsp
谢谢!还有几道题呢
先采纳,其他题在发帖
可是你的答案不对呀!我编程过了
对的。。。你不会计算???
我用电脑试过了
你的答案是15,光是5!都不止15啦
你什么都不懂,你确定编译了?
还有一个问题,可以帮我解答吗
本回答被提问者采纳
1条折叠回答
为您推荐:
其他类似问题
c语言 编程的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。计算自然数1~5的平方值并输出的程序(C语言的实验)求啊_百度知道
计算自然数1~5的平方值并输出的程序(C语言的实验)求啊
我有更好的答案
include &n&;=5;i++) {
printf(&stdio.h&void main(){ %d的平方是%d。&#92,i; for(i=1;i&lt
能在这个的基础上改改吗
#include &stdio.h&void main(){ int i=0; while(i&5) {
printf(&%d*%d=%d\n&,i,i,i*i); }}
大神,,,,膜拜你
我能再问你个问题吗
这个要怎么改T^TT^T
采纳率:64%
&&}&%d的平方是%d\n&&,i,ii);&&&&}&<img class="ikqb_img" src="&stdlib.h&gt.jpg" esrc="http.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=2a519bf2a3ec08fa26551ba36cde115b/0ecd00b;&&&&=5;i++){&&ii&&int&main(){&nbsp.hiphotos.baidu.com/zhidao/wh%3D600%2C800/sign=cc8da5b8ca35a1bf8cd4/0ecd00b.&return&&nbsp://f;);&&&&for(i=1;i&system(&pause&quot#include&stdio.h&gt
能在这个的基础上改改吗
#include&stdio.h&#include&stdlib.h&int&main(){&&&&int&i=0;&&&&while(i&5){&&&&i++;&&&&printf(&%d*%d=%d\n&,i,i,i*i);&&&&}&&&&system(&pause&);&&&&return&0;&&&&}
为您推荐:
其他类似问题
自然数的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 el表达式 int 的文章

 

随机推荐