我只是想知道这是否是C89程序的"好"代码.
obj_ptr = (obj*) (ptr1 || ptr2);
Run Code Online (Sandbox Code Playgroud)
基本上它的作用(至少在我的计算机上的GCC中)是将obj_ptr设置为ptr1,如果ptr1!= NULL,则为ptr2.
我环顾四周,看不出这是否正确,但从||的事实判断 运算符必须将指针转换为整数然后我必须将它们抛回来是一种不好的风格.
如果这是不好的风格或不可移植,并且是否有更好的(希望)同样简洁的解决方案?
编辑:我主要关心的是我编写的代码是否可移植,并且不依赖于未定义的行为.
我可能找到了一种更好的便携方式,我认为它是"好的风格"(除非你不喜欢if语句中的赋值).
if(!(obj_ptr = ptr1))
obj_ptr = ptr2;
Run Code Online (Sandbox Code Playgroud) 我写了这段代码,因为我在写一个更大的程序时遇到了类似的问题.尽管如此,我知道问题是一样的,所以我做了一个小例子.
#include <stdio.h>
typedef struct
{
int x;
char * val;
}my_struct;
int main()
{
my_struct me = {4, " "};
puts("Initialization works.");
me.val[0] = 'a';
puts("Assignment works.");
puts(me.val);
puts("Output works.");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当使用tcc(Tiny C Compiler)编译时,它编译并执行正常.但是,使用GCC 4.6.0 20110513(预发行版)它会编译,但是,当我执行它时,我只能通过"初始化工作".在获得段错误之前.
我究竟做错了什么?是我的代码还是我的GCC编译器?