Question 2: 1.null 2. Remove Terminator 3. * to ++ 4. 1, s2 because the length of s 1 is greater than s2.
The third question:
1)const constants have data types, while macro constants have no data types. The compiler can check the type safety of the former. The latter is only replaced by characters, and there is no type safety check, and unexpected errors (marginal effect) may occur in character replacement.
(2) Some integrated debugging tools can debug const constants, but they cannot debug macro constants.
The fourth question:
The range of an identifier usually means that the identifier can be used within that range.
But I only know the range of four identifiers:
File scope: If the place where the identifier is declared is outside any statement block and parameter list, then the identifier has a file scope. You can use this identifier anywhere after the declaration (and before the end of the translation unit), just like declaring a global variable before the main function.
Statement block range: Identifiers declared in a statement block have a statement block range, but labels are the exception. Such an identifier can only appear "at the declaration" to "at the end of the smallest statement block containing the declaration".
For example, variables enclosed in braces.
Function prototype scope: the parameter name in the function prototype has the function prototype scope. These parameter names are not important outside the prototype, so they only have the meaning of comments.
Function scope: the scope of the tag must be in the function body where the tag is located, even if it is placed in a nested statement block. In other words, you can use the goto statement to jump from any point in the same function to a label.