鱼C论坛

 找回密码
 立即注册
查看: 3037|回复: 3

[已解决]c的语句到底是从左往右进栈的,还是从右往左

[复制链接]
发表于 2019-4-22 15:11:09 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 方大侠 于 2019-4-22 21:25 编辑

下面的程序:
#include<stdio.h>
  
#define SQUARE(x) ((x)*(x))

int main(){
    int i=1;

    printf("%d的平方是%d\n",i-1,SQUARE(i++));
    return 0;
}
输出:
MacBook-Air:Cprogram f$ ./test
0的平方是2
printf("%d的平方是%d\n",i-1,(i++)* (i++));
这说明是该语句是先读i-1,再读SQUARE的,从左往右进栈的。

但是小甲鱼输入的程序刚好相反,是先右边再左边的。
屏幕快照 2019-04-22 下午3.08.33.png
屏幕快照 2019-04-22 下午3.08.45.png

话说这里为什么是
2的平方是1??
(i++)* (i++) 这个不应该是 1*2=2,然后 3-1=2
输出 2的平方是2  吗??我傻逼了吗。。我晕了
最佳答案
2019-4-22 15:11:10
本帖最后由 Croper 于 2019-4-22 23:40 编辑

C语言默认的__cdecl是从右至左,
但是你这个问题跟进栈顺序无关
https://fishc.com.cn/thread-132932-1-1.html

简单地说就是这种用法属于未定义行为,结果是环境相关的,什么也不能说明

最佳答案

查看完整内容

C语言默认的__cdecl是从右至左, 但是你这个问题跟进栈顺序无关 https://fishc.com.cn/thread-132932-1-1.html 简单地说就是这种用法属于未定义行为,结果是环境相关的,什么也不能说明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-22 15:11:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Croper 于 2019-4-22 23:40 编辑

C语言默认的__cdecl是从右至左,
但是你这个问题跟进栈顺序无关
https://fishc.com.cn/thread-132932-1-1.html

简单地说就是这种用法属于未定义行为,结果是环境相关的,什么也不能说明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-22 21:25:57 | 显示全部楼层
大佬快来 我哭&#128546;啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-23 09:29:02 | 显示全部楼层
Croper 发表于 2019-4-22 23:32
C语言默认的__cdecl是从右至左,
但是你这个问题跟进栈顺序无关
https://fishc.com.cn/thread-132932-1-1 ...

我看了帖子,总结起来就是一句话:C具有未定义行为的概念,即某些语言结构在语法上是有效的,但是在代码运行时您无法预测行为,不必纠结。
不过 未定义行为 这个概念也太抽象了,在printf里连续使用i++为什么就算未定义行为,怎么才算未定义行为呢?真令人头大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 17:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表