Tag: 评估

如何连接,评估和字符串化宏?

我试图对宏连接的替换(评估)进行字符串化。 例如: #include #define FOO_ONE 12 #define FOO_TWO 34 #define BAR_ONE 56 #define BAR_TWO 78 #define MAKE_MAC(mac) // … what to do here? void main(int argc, char *argv[]) { printf(“FOO: ” MAKE_MAC(FOO) “\n”); printf(“BAR: ” MAKE_MAC(BAR) “\n”); } 我想要的结果是: FOO: 1234 BAR: 5678 我尝试了几种forms,我认为最好的尝试是这样的: #define STRINGIFY(mac) #mac #define CONCAT(mac1, mac2) STRINGIFY(mac1 ## mac2) #define MAKE_MAC(mac) […]

当p和q指向同一个对象时,“* p = ++(* q)”是否未定义?

在阅读了序列点之后,我了解到i = ++i是未定义的。 那么这段代码怎么样: int i; int *p = &i; int *q = &i; *p = ++(*q); // that should also be undefined right? 假设p和q的初始化取决于某些(复杂)条件。 并且他们可能像上面的情况一样指向同一个对象。 会发生什么? 如果未定义,我们可以使用哪些工具进行检测? 编辑:如果两个指针不应该指向同一个对象,我们可以使用C99限制吗? 这是“严格”的意思吗?

在C中评估赋值运算符的左操作数有什么意义?

根据ISO C11 – 6.5.16.3,它说 赋值运算符将值存储在左操作数指定的对象中。 赋值表达式在赋值后具有左操作数的值,但不是左值。 赋值表达式的类型是左值操作数在左值转换后将具有的类型。 在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序。 对操作数的评估是不确定的。 所以我猜这意味着,例如, int x = 10; x = 5 + 10; 左操作数x计算为10,右操作数计算为15。 右操作数值存储在左操作数x指定的对象中。 但是如果赋值的目的是存储右操作数的evalauted值(就像在step2中那样),为什么左操作数的评估是必要的? 评估左操作数有什么意义?

如何评估嵌套的预处理器宏

假设我想选择某个预处理程序指令的行为,在编译时评估常量字符串和另一个宏的结果的串联。 #define CASE1 text1 #define CASE2 text2 #define CASE3 text3 #define SCENARIO 3 /** the following won’t work – for examplification purposes only**/ #define FUNCTION CASE##SCENARIO /** whenever I write FUNCTION, I expect to see text3 **/ 我很难想到一个可行的解决方案,因为预处理器是一次通过的野兽。 这甚至可行吗?

这个程序有任何序列点问题吗?

#include int main() { int i=7,j; j=(i++,++i,j*i); return 0; } j =(i ++,++ i,j * i);这个定义得很好吗? 让我明白我的疑问。

C / C ++数学运算顺序

所以我知道C ++有一个运算符优先级 int x = ++i + i++; 未定义,因为pre ++和post ++处于同一级别,因此无法确定哪个将首先计算。 但我想知道的是,如果 int i = 1/2/3; 未定义。 我问的原因是因为有多种方法可以看(1/2)/ 3 OR 1 /(2/3)。 我的猜测是它是一个未定义的行为,但我想确认一下。

C:使用&&运算符时是否存在“惰性求值”,就像在C ++中一样?

我想知道这看起来是否正确: while((next !=NULL) && (strcmp(next->name, some_string) < 0) { //some process } 我的意思是,如果next是NULL ,那么表达式的第二部分将不会被编译器测试过? 我听说在C ++中就是这种情况(但我甚至都不确定)。 有人可以证实我在某些编译器上不会出现奇怪的错误吗?

c表达评估员

好吧,我想在文本文件中有一个这样的字符串: ((( var1 AND var2 AND var3) OR var4) AND ((var5 OR var6) AND var7)) 在将其解析为c程序并处理并正确设置变量后,它最终会看起来像这样: ((( 1 AND 0 AND 0) OR 1) AND ((0 OR 1) AND 1)) 是否有任何有用的库用于评估表示为这样的一个字符串的表达式? 我以为我可以用字符串作为参数调用一个perl程序,它可以很容易地返回结果,但不确定C中是否有一个库可以做到这一点,或者是否有任何已知的算法可以解决这样的表达? 编辑:我实际上正在寻找的东西会吐出这个表达的答案,也许解析是一个坏词。 即1或0 在一个坚果壳中,它包含一堆随机表达式(已知为正确格式)的文件需要被评估为0或1.(上面评估为1,因为它导致(1和1)。

为什么这些构造使用前后增量未定义的行为?

#include int main(void) { int i = 0; i = i++ + ++i; printf(“%d\n”, i); // 3 i = 1; i = (i++); printf(“%d\n”, i); // 2 Should be 1, no ? volatile int u = 0; u = u++ + ++u; printf(“%d\n”, u); // 1 u = 1; u = (u++); printf(“%d\n”, u); // […]