c的语句到底是从左往右进栈的,还是从右往左
本帖最后由 方大侠 于 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的,从左往右进栈的。
但是小甲鱼输入的程序刚好相反,是先右边再左边的。
话说这里为什么是
2的平方是1??
(i++)* (i++) 这个不应该是 1*2=2,然后 3-1=2
输出 2的平方是2吗??我傻逼了吗。。我晕了 本帖最后由 Croper 于 2019-4-22 23:40 编辑
C语言默认的__cdecl是从右至左,
但是你这个问题跟进栈顺序无关
https://fishc.com.cn/thread-132932-1-1.html
简单地说就是这种用法属于未定义行为,结果是环境相关的,什么也不能说明 大佬快来 我哭😢啦 Croper 发表于 2019-4-22 23:32
C语言默认的__cdecl是从右至左,
但是你这个问题跟进栈顺序无关
https://fishc.com.cn/thread-132932-1-1 ...
我看了帖子,总结起来就是一句话:C具有未定义行为的概念,即某些语言结构在语法上是有效的,但是在代码运行时您无法预测行为,不必纠结。
不过 未定义行为 这个概念也太抽象了,在printf里连续使用i++为什么就算未定义行为,怎么才算未定义行为呢?真令人头大
页:
[1]