[英]Applying increment to ternary operator in C
我认为三元运算符返回左侧或右侧的值:
取决于条件。 为什么这段代码打印1?
#include <stdio.h>
int main(int argc, char const *argv[]) {
int c = 0;
(c?c:0)++;
printf("%i", c);
return 0;
}
您似乎有编译器错误,或者可能是语言扩展,因为这不是有效的C.您需要一个左值来应用++
运算符,而(c?c:0)
不是左值。
我也遇到了一些与此相关的奇怪现象。 似乎三元条件的结果可以被视为gcc 3.3.2中的左值,但不是gcc 4.6(我没有更多的版本准备好进一步缩小它)。 事实上,使用gcc 4.6编译gcc 3.3.2是不可能的,因为gcc 4.6对构成左值的内容更加挑剔。
另一个来自gcc 3.3.2源代码的例子,它不能用gcc 4.6编译:
char *x = ...;
*((void**)x)++ = ...;
gcc 4.6可以将转换的结果视为左值并将其递增,但gcc 4.6不会。
我也没有相关的标准来发现这是在官方标准中改变的东西,或者只是gcc在某个阶段允许的东西。
另请注意,C ++允许三元运算符返回左值,但仍然不能递增0.所以这是有效的C ++但不是有效的C:
int c = 0, d = 0;
(c?c:d)++;
仅仅因为你在做
(c?c:0)++;
如果你不让“++”发生,你会得到你想要的。
#include <stdio.h>
int main(int argc, char const *argv[]) {
int c = 0;
/* (c?c:0)++; */
printf("%i \n", (c?c:0)++ );
return 0;
}
输出是:
$ gcc -o ternary ternary.c
$ ./ternary
0
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.