我有一个令人讨厌的方法是在计算参数时运行函数,但正弦我不知道它叫什么我无法搜索出规则。
一个例子
char dstr[20];
printf("a dynamic string %s\n", (prep_dstr(dstr),dstr));
这个想法是“()”将在执行prep_dstr函数后返回地址dstr。
我知道它很丑陋,我之前可以在线上做 - 但它很复杂......
#好的 - 回答不要这样做的恳求。
我实际上正在对一些现有的代码进行MISRA清理(不是我的不要射击我),目前'prep_dstr'函数需要一个缓冲区修改它(不考虑缓冲区的长度)并返回指针它作为参数传递。
我喜欢迈出一小步 - 然后再迈出一小步。
所以 - 一个稍微不那么讨厌的方法比返回一个没有关于其持久性的线索的指针是停止函数返回一个指针并使用逗号运算符(在确保它不会从缓冲区的末尾开始)。 / p>
这会导致MISRA错误倒计时,当它仍然有效且MISRA错误消失时,我会尝试优雅 - 也许是接下来的一年:)。
答案 0 :(得分:2)
逗号运算符具有适当的优先级,此外,它提供序列点,也就是说,它定义了程序执行流程中的一个点,其中解决了所有先前的副作用。<登记/>
因此,无论您的函数prep_dstr()
对字符串dstr
做什么,它都会在到达逗号运算符之前完成。
另一方面,逗号运算符给出一个表达式,其值是最右边的操作数。
以下示例可根据需要为您提供值dstr
:
5+3, prep_dstr(dstr), sqrt(25.0), dstr;
a+b-c, NULL, dstr;
(prep_dstr(dstr), dstr);
当然,只要您需要字符串dstr
,就可以使用这种表达式。
之前,您在问题中使用的语法,然后,它完美地完成了工作。
由于您可以使用语法,因此您可以使用另一种方法
通过考虑函数printf()
是函数,它尤其是表达式
通过这种方式,它可以放在逗号表达式中:
prep_dstr(dstr), printf("Show me the string: %s\n", dstr);
似乎每个人都在告诉你“不要以这种方式编写代码......” 编程风格中的这种宗教建议被高估了 如果你需要做某事,那就去做吧。
C的一个原则是:“不要阻止程序员做必须做的事情。”
但是,无论你做什么,都要尝试编写可读代码。
答案 1 :(得分:1)
是的,您使用的语法将适用于您的目的。
但是,请考虑编写干净且可读的代码。例如,
char buffer[20];
char *destination = prepare_destination_string(buffer);
printf("a dynamic string %s\n", destination);
一切都可以干净利落地命名。理解,并且易于推断的预期行为。您甚至可以省略某些部分,例如destination
,或执行更简单的错误检查。
答案 2 :(得分:0)
你的墨水和你的代码都是正确的。那就是说,请不要这样做。将prep_dstr
放在自己的行上可以更容易地推断发生的事情和时间。
您正在考虑的是逗号运算符。在逗号不具有其他含义的上下文中(例如分隔函数参数),表达式a, b
的值为b
,但首先计算a
。代码中的额外括号会导致逗号以这种方式解释,而不是作为函数参数分隔符。