我有一个朋友的挑战
作为这个挑战的一部分,我编写了一个函数来从int
获取String
,该函数获取一个chars
数组和一个指向数字的指针,一个索引。
要检查此功能是否有效,我使用2个数字运行它并观察输出。
在我的main
我打印了4个值:
int t = 0;
printf("%d -> %d, %d -> %d\n", t, getNumber("99", &t), t, getNumber("as48", &t));
应该如此,我应该得到:0 -> 99, 2 -> 48
。
输出为:2 -> 99, 0 -> 0
。
经过几次测试后,我看到它在函数结束后打印t
并且它首先执行最后一次函数调用。
我理解这是有道理的:在Assembly
中,最后一个参数首先被推送到堆栈,所以当它被加速时,参数将按正确的顺序排列。
我的问题是:
我可以以“正常”的方式打印它,看起来应该“应该”吗?怎么样?
答案 0 :(得分:4)
我可以以“正常”方式打印,因此它看起来应该“应该”吗?怎么样?
无法保证C中函数参数的评估顺序。所以,答案是否
另请注意,printf
函数调用调用未定义的行为作为其参数的评估顺序 unsequenced 。
答案 1 :(得分:0)
您可以在C ++中执行此操作。
虽然我不知道您如何实施getNumber()
功能,但您可以使用stoi()
库中的string
功能。
int stoi (const string& str, size_t* idx = 0, int base = 10);
它基本上将字符串转换为整数。 stoi
解析str
将其内容解释为指定基数的整数,并以int
值的形式返回。
如果idx
不是空指针(nullptr
),则该函数还会将idx
的值设置为数字后str
中第一个字符的位置。
因此假设您的所有数字都是base 10
,您可以使用类似
int i = std::stoi ("as48", nullptr, 10);
int j = std::stoi ("99", nullptr, 10);
printf ("%d %d\n", i, j);
您可以使用idx
代替t
来获取数字部分开始的索引 - std::string::size_type idx;
并将其作为参数传递给stoi()
函数而不是nullptr
。