不同编译器产生不同的输出 - C和C++
不同的编译器在C和C++中对于相同的代码可能会产生不同的输出。一个例子是下面的代码:
int main() { return sizeof 'a'; }
这段代码的功能是返回字符'a'的大小。然而,这种写法在不同的编译器中可能会有不同的输出。
问题的出现是因为C和C++在处理字符字面值时有所不同。在C中,字符字面值的类型是int,所以sizeof 'a'返回的是字符'a'的大小,通常是1字节。然而,在C++中,字符字面值的类型是char,所以sizeof 'a'返回的是字符'a'的大小,通常也是1字节。
解决这个问题的方法是使用显式的类型转换来指定字符字面值的类型。例如,在C中,可以将代码修改为:
int main() { return sizeof(char) * (int) 'a'; }
这样就可以确保在不同的编译器中都得到相同的输出。
在C++中,可以将代码修改为:
int main() { return sizeof(char) * static_cast('a'); }
这样也可以确保在不同的编译器中得到相同的输出。
,不同的编译器在处理C和C++代码时可能会产生不同的输出。这个问题的解决方法是使用显式的类型转换来指定字符字面值的类型,以确保在不同的编译器中得到相同的输出。
不同编译器的输出差异 - C和C++的不同输出
在ISO C和ISO C++之间存在一些不兼容之处。一个常见的例子是sizeof('A')
,在C中通常为4,在C++中则始终为1,因为像'A'
这样的字符常量在C中具有int类型,在C++中则具有char类型。
#includeint main(void) { printf("%d\n", sizeof('A')); }
运算符sizeof
返回的是size_t
而不是int
。所以你的代码包含错误。[stackoverflow.com/questions/940087/...](http://stackoverflow.com/questions/940087)
而sizeof (int)
可能是1。
这个问题的出现的原因是由于C89和C99在处理注释的方式上有所不同。在C89中,注释是以//
开始直到行末为止,而在C99中可以使用//
或者/* */
来注释代码。
在给定的程序中,int a = 12//**/2;
这一行代码在C89中会被认为是注释,因此会被忽略掉,而在C99和C++中,这一行代码会被当作有效代码来处理。
为了解决这个问题,可以采取以下几种方法:
1. 将注释代码修改为C89的格式,即将//**/
修改为//***/
。
2. 将编译器的标准设置为C99或C++,这样代码就会按照C99或C++的注释规则进行处理。
3. 将代码中的注释改为/* */
的格式,这样代码就会在C89、C99和C++中都能正常运行。
通过以上的修改,无论使用C89、C99还是C++编译器,程序都会输出12
。